簡體   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