繁体   English   中英

用户如何在不更改app.config的情况下在桌面应用程序中启用Background Server GC?

[英]How can users enable Background Server GC in a desktop app without changing app.config?

我照顾许多用户在不同硬件上运行的WPF桌面应用程序。 多个线程不断搅动大量数据。

启用.NET Framework 4.5后台服务器垃圾回收已显示出显着的性能改进,但这是以使用更多内存和使用不同CPU使用方式为代价的。 对于使用性能较低的计算机的用户来说,这是一个潜在的问题,因此我想让受益最大的用户选择启用服务器GC,而不是强加给所有人。

到目前为止,我发现启用此功能的唯一方法是在App.Config中

<configuration>
  <runtime>
    <gcServer enabled="true"/>
  </runtime>
</configuration>

但是,大多数用户没有权限对此进行编辑,因为该应用程序位于Program Files中,并且他们不是本地管理员。 我的理想情况是使用一个措辞友好的选项,该选项可以在启用服务器GC的情况下重启应用程序并记住他们的选择。

所以我的问题是:是否有人知道应用此设置的任何其他方式?

我知道这可能是一厢情愿的想法-但理想情况下,某些东西在运行时是动态的,或者是可以在过程上下文中设置的命令行参数或环境变量。 带有complus_gcServer env变量CoreCLR中存在此提示。

我已经阅读了可以在计算机上启用此功能的全局系统设置,但我不想冒险影响任何其他应用程序并造成其他不利影响,我只希望将此应用于我的应用程序。

作为最后的选择,我可以使用不同的配置文件和启动程序来部署EXE的两个副本,以选择要运行的正确版本,但这似乎很极端。

感谢您的阅读,欢迎任何想法!

这是一个替代建议。 完成后,保持服务器GC处于启用状态。 然后,根据用户定义的设置,如果应用程序内存超过确定为关键级别的某个阈值,则强制GC运行。

请注意,如果您遵循这条路径,则实际上是在说您对CLR应该何时运行垃圾收集有更好的了解。 通常,我发现CLR本身比我们进行干预时做得更好。

用于检查内存使用情况并在所有世代或指定世代中运行GC的代码

if (Math.Abs(DateTime.Now.Subtract(MemUsageLastCheckTime).TotalMinutes) > 5d)
{
    long UsedMemory;
    //UsedMemory = GC.GetTotalMemory(false); // Not as reliable
    UsedMemory = System.Diagnostics.Process.GetCurrentProcess().PagedMemorySize64;
    if (UsedMemory > 1073741824) // One GB in bytes 1 X 1024 X 1024 X 1024
    {
        GC.Collect(); // Collect all generations
        //GC.Collect(2,GCCollectionMode.Forced);; Or collect a specific generation and force it to run now
    }
    MemUsageLastCheckTime = DateTime.Now;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM