Определить, все ли подпроцессы закрыты - PullRequest
0 голосов
/ 27 ноября 2018

В моем приложении пользователь может запустить визуальный процесс создания кода студии, нажав кнопку (отключение становится после нажатия кнопки).Теперь я хочу определить, когда оно закроется Exited -вентом.Перед запуском процесса я должен проверить, есть ли уже запущенный экземпляр, потому что тогда я должен подписать запущенный процесс на Exited событие (если я подпишу на него мой новый процесс, он будет запущен немедленно).

Проблема в том, что если вы запускаете один экземпляр кода VS, есть 5 «подпроцессов», поэтому я должен определить, все ли они закрыты, прежде чем я смогу снова включить кнопку.После события Exited не все процессы завершаются мгновенно.

Одним из решений было Thread.Sleep(500), но, на мой взгляд, это не очень хороший способ решить его.

Есть ли другое решение?

РЕДАКТИРОВАТЬ: Основная задача состоит в том, чтобы определить, находится ли процесс на пути к остановке.

1 Ответ

0 голосов
/ 27 ноября 2018

вы можете создать с помощью таймера или задачи (например): Process.GetProcesses () и проверять каждую секунду, если process.id снова существует, вы просто создаете список идентификаторов для тестирования с известными идентификаторами

        var pidlist = new List<int>() { 8, 3, 6300 };
        Process[] processes = Process.GetProcesses();
        var result = processes.Select(x => x.Id).Any(pid =>
        {
            if (pidlist.Contains(pid)) return true;
            return false;
        }) ;

Вы можете просто выполнить цикл while с тестом результата var, а результат ожидания равен false.

        var pidlist = new List<int>() { 8, 2952, 630 };
        bool result = true;
        while (result)
        {
            Process[] processes = Process.GetProcesses();
            result = processes.Select(x => x.Id).Any(pid =>
            {
                if (pidlist.Contains(pid)) return true;
                return false;
            });
            System.Threading.Thread.Sleep(1000);
        }

Вы можете упростить вычисление результата, если хотите

result = processes.Select(x => x.Id).Any(pid => pidlist.Contains(pid));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...