【问题标题】:Questions about Memory Usage in Windows Phone app关于 Windows Phone 应用程序中的内存使用的问题
【发布时间】:2014-01-16 23:11:21
【问题描述】:

如何减少我的 C# Windows Phone 应用程序的内存使用量?

一些实例:

1)。使用方法:LockScreen.GetImageUri()

我可以在 cs 文件的顶部添加using Windows.Phone.System.UserProfile;。 或者在它前面加上前缀Windows.Phone.System.UserProfile.,就是Windows.Phone.System.UserProfile.LockScreen.GetImageUri()

哪个会使用更少的内存?

2)。考虑变量的范围,如果我将方法分成多个部分并逐个运行它们,它会更频繁地释放内存吗?

例如我需要使用WriteableBitmap 渲染一些图像,每个可能会消耗 1MB 内存,如果我有 10 个或更多图像要渲染,它可能很快就会超过内存限制。

如果我用不同的方法渲染它们会有帮助吗?

3)。哪个是更好的选择:静态还是非静态?

似乎只要应用程序“活着”或“运行”,静态对象就会一直存在于内存中,但是,要使用非静态方法,我们需要创建它的一个实例,每次都会消耗内存我们这样做(不是吗?)。

添加:如果我创建了一个类对象的实例,我仍然可以“释放”它吗?

一种特殊情况:使用IsolatedStorageSettings.ApplicationSettings;

我可以像这样使用它:

IsolatedStorageSettings settings = IsolatedStorageSettings.ApplicationSettings;
if (!settings.Contains("IconSet"))
{
    settings["IconSet"] = "Set1";
}

或者我也可以使用

if (!IsolatedStorageSettings.ApplicationSettings.Contains("IconSet"))
{
    IsolatedStorageSettings.ApplicationSettings["IconSet"] = "Set1";
}

有什么不同吗? (关于内存使用)

4)。 Deployment.Current.Dispatcher.BeginInvoke(() =>{})

这个方法会释放它使用的内存吗? 还是我需要任何特殊的方法来手动释放内存?比如EndInvoke()?

【问题讨论】:

    标签: c# memory-management windows-phone-8


    【解决方案1】:
    1. 没有区别。

    2. 图像等使用大量内存的对象通常实现 IDispose。为确保在不再需要内存时释放内存,您应该在不再需要内存时调用对象的 dispose。就我个人而言,我找到了一种更简单的方法来管理它,而不是在对象上显式调用 Dispose,而是将其包装在 using 语句中,例如

      使用(图像我的图像 = 新图像(我的文件)) { // 渲染我的图像 }

    3. 人们会说将所有内容声明为静态,因为它更快。我个人认为,当您尝试将所有内容声明为静态时,您将失去 .NET 作为 OO 语言的所有好处。除非性能是绝对关键的,否则我不鼓励过度使用静态,因为在大多数情况下,好处是微不足道的,而且对代码结构的妥协是相当大的。

    4. EndInvoke() 不释放内存

    回答 Max Meng...

    .NET 框架中有多个 Image 类。例如

    http://msdn.microsoft.com/en-us/library/system.drawing.image(v=vs.110).aspx

    WPF 控件不实现 IDispose。控件归其父控件所有。完成后释放与页面上的控制调用相关的内存。

    What is the correct way to dispose of a WPF window?

    如果 IDispose 未在 .NET Framework 类中实现,则意味着没有与该类关联的非托管或大量资源,或者其他一些组件负责管理其资源。

    【讨论】:

    • 要补充一点,请记住,如果您仍然引用对象,GC 将无法回收对象。如果您有一些实例变量持有瞬态对象,请确保在不使用它们时将它们清空,以便垃圾收集器可以回收它们。
    • @Mick,将尝试 using 块,谢谢。知道 BeginInvoke 方法的内存使用情况吗?
    • @antiduh,GC 似乎只是周期性运行,当我的应用程序只会在不到 5 秒内运行任务时,我似乎不能指望它?
    • 内存压力时gc也应该运行。
    • @Mick,请原谅我的无知,似乎 using 块不适用于 Image 对象?它说'System.Windows.Controls.Image': type used in a using statement must be implicitly convertible to 'System.IDisposable'我错过了什么?
    猜你喜欢
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多