Wpf 我需要更好地理解.Net内核的内存管理,以便为我的应用程序确定正确的结构

Wpf 我需要更好地理解.Net内核的内存管理,以便为我的应用程序确定正确的结构,wpf,memory-management,memory-leaks,domainunload,Wpf,Memory Management,Memory Leaks,Domainunload,我需要一个在后台运行的应用程序,唯一的用户交互是通过一个可点击的通知图标来表示的,该图标显示一个WPF窗口,用户可以在其中管理设置和其他事情。 该窗口的打开不应该频繁,而且由于WPF占用大量资源,我认为最好的解决方案可能是通过新的AssemblyLoadContext特性加载和卸载。不幸的是,在我的上一个问题中,我证明了它不起作用,并向DotNet工作人员报告了这个bug(他们将我的问题转移到了未来的里程碑)。 在那个消息之后,我决定做一些实验,结果是这样的: class Program {

我需要一个在后台运行的应用程序,唯一的用户交互是通过一个可点击的通知图标来表示的,该图标显示一个WPF窗口,用户可以在其中管理设置和其他事情。 该窗口的打开不应该频繁,而且由于WPF占用大量资源,我认为最好的解决方案可能是通过新的AssemblyLoadContext特性加载和卸载。不幸的是,在我的上一个问题中,我证明了它不起作用,并向DotNet工作人员报告了这个bug(他们将我的问题转移到了未来的里程碑)。 在那个消息之后,我决定做一些实验,结果是这样的:

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

现在

  • 如果我可以在一个应用程序中执行所有操作,并且在这两种情况下都释放了内存,那么将WPFlibrary存储在单独的程序集中并通过AssemblyLoadContext加载/卸载它有什么好处
  • 为什么我的解决方案可以在几个小时甚至更长时间后立即释放内存?是什么标准使得清洁如此随机
  • 关于我的解决方案和装配装载/卸载之间的区别,我应该知道什么
  • 我最初的想法是在一个单独的进程中运行WPF应用程序,并通过IPC(命名管道)从我的主应用程序与之通信,但在经历了上述代码之后,我更倾向于这样做,但我不确定,我想知道堆栈中的人会推荐什么。 我相信在我做出正确的决定之前还有很多事情要知道。 谢谢