Wpf 我需要更好地理解.Net内核的内存管理,以便为我的应用程序确定正确的结构
我需要一个在后台运行的应用程序,唯一的用户交互是通过一个可点击的通知图标来表示的,该图标显示一个WPF窗口,用户可以在其中管理设置和其他事情。 该窗口的打开不应该频繁,而且由于WPF占用大量资源,我认为最好的解决方案可能是通过新的AssemblyLoadContext特性加载和卸载。不幸的是,在我的上一个问题中,我证明了它不起作用,并向DotNet工作人员报告了这个bug(他们将我的问题转移到了未来的里程碑)。 在那个消息之后,我决定做一些实验,结果是这样的:Wpf 我需要更好地理解.Net内核的内存管理,以便为我的应用程序确定正确的结构,wpf,memory-management,memory-leaks,domainunload,Wpf,Memory Management,Memory Leaks,Domainunload,我需要一个在后台运行的应用程序,唯一的用户交互是通过一个可点击的通知图标来表示的,该图标显示一个WPF窗口,用户可以在其中管理设置和其他事情。 该窗口的打开不应该频繁,而且由于WPF占用大量资源,我认为最好的解决方案可能是通过新的AssemblyLoadContext特性加载和卸载。不幸的是,在我的上一个问题中,我证明了它不起作用,并向DotNet工作人员报告了这个bug(他们将我的问题转移到了未来的里程碑)。 在那个消息之后,我决定做一些实验,结果是这样的: class Program {
class Program
{
[STAThread, MethodImpl(MethodImplOptions.NoInlining),]
static void Main(string[] args)
{
Thread.Sleep(20000);
TestRun();
for (var i = 0; i < 1000; i++) {
GC.Collect();
GC.WaitForPendingFinalizers();
}
System.Windows.Forms.Application.Run();
}
[STAThread, MethodImpl(MethodImplOptions.NoInlining),]
static void TestRun()
{
var cl = new MainWindow();
cl.Show();
cl.Close();
}
}
类程序
{
[STAThread,MethodImpl(MethodImplOptions.noinline),]
静态void Main(字符串[]参数)
{
睡眠(20000);
TestRun();
对于(变量i=0;i<1000;i++){
GC.Collect();
GC.WaitForPendingFinalizers();
}
System.Windows.Forms.Application.Run();
}
[STAThread,MethodImpl(MethodImplOptions.noinline),]
静态void TestRun()
{
var cl=新的主窗口();
cl.Show();
cl.关闭();
}
}
基本上,它是一个WPF应用程序,添加了一个自定义入口点。当我运行程序时,在实例化主窗口之前,在任务管理器中,内存使用量是4.6MB,然后变成25-26MB左右。
一段时间后,无论我是否调用GC,内存都会减少并返回到初始值4.6MB。有时在几分钟内,有时在几小时内,有时在12小时后,记忆仍然是25-26
现在