C# System.Diagnostics.Process.GetProcessesByName ест много памяти

138
23 марта 2019, 18:20

У меня есть две программы которые просто проверяют наличие процессов друг-друга методом System.Diagnostics.Process.GetProcessesByName в цикле таким образом исключая возможность пользователя закрыть их без последствий, в теории всё должно работать нормально но результатом является 100% заполнение ЦП у обеих программ (при работе вместе, обе едят 40-50% ЦП). Вопрос, есть ли какой-либо менее затратный способ? Или какой-либо способ сократить используемую память?

Answer 1

Способ на event-ах (объект синхронизации). Будет кушать минимум ресурсов.

Код пример, приложение 1. Для приложения 2 нужно заменить все 1 на 2 и наоборот.

static void AppCheck()
{
    using (var appEvent = new EventWaitHandle(false, EventResetMode.ManualReset, "App1EventName"))
    {
        appEvent.Set();
        while (true)
        {
            using (var otherAppEvent = new EventWaitHandle(false, EventResetMode.ManualReset, "App2EventName"))
            {
                otherAppEvent.WaitOne();
            }
            Console.WriteLine("App2 started");
            var process = Process.GetProcessesByName("App2").First();
            process.WaitForExit();
            Console.WriteLine("App2 closed");
        }
    }
}
static void Main(string[] args)
{
    var thread = new Thread(AppCheck);
    thread.Start();
    Console.ReadKey();
    thread.Abort();
}
Answer 2

Совсем необязательно мотать бесконечный цикл. У класса Process есть метод WaitForExit и есть событие OnExited. Достаточно найти нужный процесс один раз, и потом или ждать его завершения Wait-ом, или подписаться на событие выхода, и в обработчике предпринимать действия по перезапуску, в зависимости от того, как лично вам удобнее.

READ ALSO
Xpath для HtmlAgilityPack C#

Xpath для HtmlAgilityPack C#

Есть такое код страницы:

146
Контрол на основе старого

Контрол на основе старого

Создаю контрол TabPage на основе старого:

132
Можно ли связать LuaJIT с C#?

Можно ли связать LuaJIT с C#?

Хотелось бы узнать, есть ли способ использовать библиотеку LuaJIT в программе, написанной на C# по аналогии с C/C++Т

141
EntityFramework 6.2.0 проблемы с выполнением запросов

EntityFramework 6.2.0 проблемы с выполнением запросов

Мы используем связку (клиент WPF) -> EF 62

121