Тщательно закрывая процессы - PullRequest
0 голосов
/ 31 марта 2020

Основная цель - закрыть Process и не оставлять никаких зависающих соединений, подпроцессов.

Существует простой сервис, работающий 24/7, и каждую минуту он проверяет, есть ли новое задание начать. Если он находит его, он начинает его

  public Process StartProcess(string pathToExecutable, string arguments)
        {
            var processStartInfo = new ProcessStartInfo
            {
                FileName        = pathToExecutable,
                Arguments       = arguments,
                UseShellExecute = false,
                CreateNoWindow  = true
            };

            return Process.Start(processStartInfo);
        }

И при попытке закрыть

   public bool TryCloseProcess(Process process, int waitSeconds)
        {
            try
            {
                process.CloseMainWindow();
                process.WaitForExit(waitSeconds);
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }

Любой правильный способ быть уверенным, что все ресурсы будут освобождены, и т. Д. c?

1 Ответ

1 голос
/ 31 марта 2020

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

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

Запущенный процесс должен обработать все остальное. (Изящный выход)

Когда вы остановите процесс, все управляемые (а также неуправляемые) ресурсы, которые он использовал, будут освобождены независимо от того, * вы Dispose() их или нет.

Не будет утечка памяти из-за того, что ваша операционная система освобождает полный рабочий набор.

Следует учитывать, есть ли текущие фоновые процессы (запущенные вами потоки, которые не помечены как IsBackground = true, будут продолжать работать и предотвращать приложение закрыто), Задачи , которые вы запустили, и вы должны реализовать изящный выход для любых внешних подключений и т. д. c. для них.

Если одна из задач в этот момент - запись в файл, файл будет частично записан. Если в этот момент поток выполняет какой-либо сетевой ввод-вывод, он будет прерван. Он будет отключен от удаленного конца преждевременно. Вам не нужно беспокоиться о памяти и обрабатывать утечки, но следует рассмотреть возможность постепенного прекращения таких процессов (файловый ввод-вывод, сетевой ввод-вывод и т. Д. c.)

Ваши финализаторы будут быть вызванным во время прекращения. Это хорошее место для выполнения очистки.

Также см. Здесь для как использовать токен отмены , чтобы остановить задачу, когда она будет отменена.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...