有关Windows Phone应用程序中内存使用的问题

时间:2013-12-30 04:11:48

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

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

有些情况:

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

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

哪一个会少用内存?

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

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

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

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

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

ADD:如果我创建了一个类对象的实例,我可以“处理”它吗?

特殊情况:使用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()

1 个答案:

答案 0 :(得分:0)

  1. 没有区别。

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

    使用(Image myImage = new Image(Myfile)) { //渲染myImage }

  3. 人们会说声明一切都是静态的,因为它更快。我个人认为,当您尝试将所有内容声明为静态时,您将失去.NET作为OO语言的所有好处。除非性能绝对至关重要,否则我不鼓励过度使用静态,因为在大多数情况下,这些好处可以忽略不计,并且对代码结构的妥协是相当大的。

  4. EndInvoke()不释放内存

  5. 回答Max Meng ...

    .NET框架中有多个Image类。 e.g。

    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?

    如果在.NET Framework类中未实现IDispose,则表示没有与该类关联的非托管或实质资源,或者某个其他组件负责管理其资源。