Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WinRT样本持有的内存未释放_C#_Image_Memory_Memory Leaks_Windows Runtime - Fatal编程技术网

C# WinRT样本持有的内存未释放

C# WinRT样本持有的内存未释放,c#,image,memory,memory-leaks,windows-runtime,C#,Image,Memory,Memory Leaks,Windows Runtime,我试图在从样本中删除图像时释放图像所保留的内存。我附上了一个例子来说明这个问题 复制此问题的步骤: 步骤1:运行示例,您会注意到示例将消耗大约21MB的内存 第二步:点击AddCtrl按钮,大约会消耗54MB的内存 第三步:点击RemoveCtrl按钮,消耗的内存不会释放 我在微软的论坛上发布了这篇文章,他们说这是操作系统的问题。有人能告诉我释放内存的方法吗。当对象不再被引用时,.NET中的垃圾收集通常不会立即释放内存,但在您的例子中,还有更多的方法。在示例中,您的代码通过将图像添加到Stack

我试图在从样本中删除图像时释放图像所保留的内存。我附上了一个例子来说明这个问题

复制此问题的步骤:

步骤1:运行示例,您会注意到示例将消耗大约21MB的内存

第二步:点击AddCtrl按钮,大约会消耗54MB的内存

第三步:点击RemoveCtrl按钮,消耗的内存不会释放


我在微软的论坛上发布了这篇文章,他们说这是操作系统的问题。有人能告诉我释放内存的方法吗。

当对象不再被引用时,.NET中的垃圾收集通常不会立即释放内存,但在您的例子中,还有更多的方法。在示例中,您的代码通过将图像添加到StackPanel来添加图像,但“移除”按钮尝试通过从其父网格中移除ScrollViewer(StackPanel的父级)来清除图像。这是原始代码:

private void btnRemoveControl_Click(object sender, RoutedEventArgs e)
{
    parentGrid.Children.Remove(scrollViewer);
}
我认为这是一种奇怪的方式,因此我更改了代码,只需从添加图像的StackPanel中删除图像:

private void btnRemoveControl_Click(object sender, RoutedEventArgs e)
{
    stackPanel.Children.Clear();
}
这实际上会导致在单击“删除”按钮时立即释放大部分内存。在我的测试中,单击Add会将内存增加到50MB,单击Remove和这个新代码会将内存减少到29MB

但是请记住,.NET在回收内存方面并不是非常积极的,除非它处于压力之下。因此,我添加了另一行:

private void btnRemoveControl_Click(object sender, RoutedEventArgs e)
{
    stackPanel.Children.Clear();
    GC.Collect();
}
有了这些代码,在我的测试中,单击Remove会将内存从50MB降低到12MB

然而,将GC.Collect()调用放在代码中通常是一个非常糟糕的主意,而且对性能非常糟糕,因为它会强制所有代立即执行GC。当.NET认为需要清理内存时,最好让它清理内存。我只是添加了这一行来证明GC是否可以在需要时释放剩余内存

您需要做的是确保您没有保留对不再需要的对象的引用,以便.NET能够在访问它时清理内存。在您的原始代码中,我相信ScrollViewer仍然在某处被引用,可能是因为它是在XAML中定义的。ScrollViewer保存对StackPanel的引用,StackPanel保存对图像的引用,因此它们都不能被垃圾收集。但是,如果你只是删除图像,这是你真正试图从内存中释放出来的,它会起作用