gpt4 book ai didi

.net - 如何立即释放 WPF 应用程序中的内存以便它可以反射(reflect)在 TaskManager 中?

转载 作者:行者123 更新时间:2023-12-04 05:55:36 25 4
gpt4 key购买 nike

我最近在 .net 应用程序上运行了不同的测试,以了解如何减少内存占用。我遇到了各种提示/指南,例如处理非托管资源、取消注册事件、在 xaml 资源上使用 FREEZE 等,这些都是有道理的。大部分事情已经处理好了,所以内存消耗保持不变。然而,我发现,在当前运行之前从未打开过的每个新窗口都会消耗更多内存,并且在关闭窗口后似乎永远不会将其返回。

所以我在窗口关闭后立即运行 GC.Collect() 以进行调试,但没有成功。

在应用程序中有几个带有 AllowsTransparency=true 的窗口,所以我删除了该属性并看到了很大的内存差异,大约少了 5MB!,但是窗口现在占用的内存在窗口关闭后仍然没有释放,所以问题还是一样。
这是示例

C#

Window w;
bool isWindowOpen = false;
private void Button_Click(object sender, RoutedEventArgs e)
{

if (!isWindowOpen)
{
w = new Window();
isWindowOpen = true;

// turn off the following two lines to see a noteable difference.
w.AllowsTransparency = true;
w.WindowStyle = WindowStyle.None;

//Even when the transparency is set to false, the memory increased by the new
//Window will never be returned. Try making the window a little bit heavier by
//adding a few buttons and combos and clicking them rapidly before closing the
//window.

w.Show();
}
else
{ w.Close(); isWindowOpen = false; GC.Collect();
//Console.WriteLine(GC.GetTotalMemory(true).ToString());
//Console.WriteLine(GC.CollectionCount(0).ToString());
}
}

任何 CLR/WPF 大师都可以解释一下吗?在关闭透明窗口后,我绝对无法强制 GC 立即运行,从而释放它消耗的所有内存吗?我知道 GC 可能会在需要时稍后运行,但毕竟任务管理器就是客户所得到的一切,而且也有一些疯子。

最佳答案

我发现 Kernal32 dll 是我问题的答案。

[DllImport("kernel32.dll")]
private static extern bool SetProcessWorkingSetSize(IntPtr proc, int min, int max);

SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);

值为 -1 的 SetProcessWorkingSetSize 将删除尽可能多的页面,以便进程和任务管理器数字将急剧下降。然而,我不知道它有什么性能影响,但对于我的应用程序来说,它是完美的。

关于.net - 如何立即释放 WPF 应用程序中的内存以便它可以反射(reflect)在 TaskManager 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9545863/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com