2016-11-02 6 views
0

Я забочусь о рабочем приложении WPF, которое многие пользователи запускают на разных аппаратных средствах. Множество потоков постоянно перекачивают большой объем данных.Как пользователи могут использовать фоновый сервер GC в настольном приложении без изменения app.config?

Включение .NET Framework 4.5 Background server garbage collection продемонстрировало значительные улучшения в производительности, однако это связано с тем, что используется больше памяти и различные модели использования ЦП. Это потенциальная проблема для пользователей с менее мощными машинами, поэтому я хочу предоставить пользователям, которые бы выиграли от отказа от включения GC сервера, вместо того, чтобы заставлять его на всех.

Единственный способ я нашел до сих пор, чтобы включить это в App.Config:

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

Однако, большинство пользователей не имеют права редактировать это как приложение находится в Program Files, а они нет местных администраторов. Мой идеальный сценарий - это дружественный вариант, который может перезапустить приложение с включенным сервером GC и запомнить их выбор.

Так что мой вопрос: кто-нибудь знает о другом способе применения этой настройки?

Я знаю, что это, вероятно, принятие желаемого за действительное, но в идеале это что-то динамическое во время выполнения, или, возможно, аргумент командной строки или переменная среды, которая может быть установлена ​​в контексте процесса. Есть намеки на это в CoreCLR с complus_gcServer env variable.

Я читал о глобальных системных настройках, которые могут включить это на машине, но я не хочу рисковать воздействовать на другие приложения и вызывать другие неблагоприятные последствия, но я хочу, чтобы это применимо к моему приложению.

В качестве последнего средства я мог бы развернуть две копии EXE с различными конфигурационными файлами и пусковой установкой, чтобы выбрать правильную версию для запуска, однако это кажется экстремальным.

Спасибо за чтение, любые идеи приветствуются!

+0

Я видел п интересного заявления в этом блоге. «Вам не нужно ничего менять, чтобы использовать сервер GC с базовым сервером. Как и большинство функций GC, он автоматически включается для всех приложений». ...... Но пока читать полностью. https://blogs.msdn.microsoft.com/dotnet/2012/07/20/the-net-framework-4-5-includes-new-garbage-collector-enhancements-for-client-and-server-apps/ – Naidu

+0

Спасибо за ссылку, но сообщение в блоге кажется неправильным. GCSettings.IsServerGC возвращает false, если он не указан в app.config – embee

ответ

1

Вот альтернативное предложение. Оставьте сервер 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; 
} 
+0

Согласен, я предпочел бы оставить коллекции в CLR. В любом случае, спасибо. – embee

 Смежные вопросы

  • Нет связанных вопросов^_^