Если я уничтожу System.Diagnostics.Process с помощью .Kill (), нужно ли мне также вызывать .Close ()? - PullRequest
19 голосов
/ 13 апреля 2011

Используя C # 4.0, я создал System.Diagnostics.Process, который, как я ожидаю, займет короткое время для запуска.Если по какой-то причине процесс не завершился через некоторое время (например, я позвонил .WaitForExit(timeout), а возвращаемое значение было false), мне нужно выполнить очистку.Я решил, что в данной конкретной ситуации безопасно использовать .Kill() (нет никаких структур данных, о которых я беспокоюсь из-за повреждения).

Учитывая эту настройку, мне также нужно вызвать .Close()метод процесса?Если это так, я должен позвонить .Close() до или после .Kill()?

Ответы [ 2 ]

13 голосов
/ 13 апреля 2011

System.Diagnostics.Process реализует IDisposable через класс Component, а защищенный метод Dispose(bool) вызывает Close().Обычно считается хорошей практикой избавляться от одноразовых ресурсов, когда вы закончите с ними, так как это немедленно высвободит все ресурсы, связанные с классом (не нужно ждать запуска GC).Ваш вопрос:

Да, пожалуйста, позвоните Close(), вызвав метод Dispose() напрямую или через конструкцию C # using следующим образом.

using(Process proc = CreateProcess())
{
    StartProcess(proc);
    if (!proc.WaitForExit(timeout))
    {
        proc.Kill();
    }
}
12 голосов
/ 13 апреля 2011

Process.Kill() и Process.Close() оба внутренне вызывают Close() для частного объекта SafeProcessHandle, связанного с процессом. Однако Process.Close() также явно сбрасывает несколько других внутренних элементов.

Поскольку Process реализует IDisposable, вы всегда должны вызывать Close(), когда закончите, или обернуть его в блок using.

...