Если я убью System.Diagnostics.Process с .Kill(), мне также нужно вызвать .Close()?
Используя С# 4.0, я создал System.Diagnostics.Process
, который, как я полагаю, займет короткий промежуток времени. Если по какой-то причине процесс не вышел через некоторое время (например, я назвал .WaitForExit(timeout)
, а возвращаемое значение было false
), мне нужно очистить. Я решил, что безопасно использовать .Kill()
в этой конкретной ситуации (нет структур данных, которые я беспокоюсь о развращении).
Учитывая эту настройку, мне также нужно вызвать метод .Close()
для процесса? Если это так, следует ли мне позвонить .Close()
до или после .Kill()
?
Ответы
Ответ 1
System.Diagnostics.Process
реализует IDisposable
через класс Component
, а защищенный метод Dispose(bool)
вызывает Close()
. Как правило, считается хорошей практикой распоряжаться располагаемыми ресурсами, когда вы с ними работаете, так как это немедленно освободит любые ресурсы, связанные с классом (не нужно ждать, пока GC будет работать).
Итак, чтобы ответить на ваш вопрос:
Да, пожалуйста, позвоните Close()
, вызвав метод Dispose()
напрямую или через конструкцию С# using
следующим образом.
using(Process proc = CreateProcess())
{
StartProcess(proc);
if (!proc.WaitForExit(timeout))
{
proc.Kill();
}
}
Ответ 2
Process.Kill()
и Process.Close()
и внутренне вызовите Close()
на частный объект SafeProcessHandle, связанный с процессом. Однако Process.Close()
также явно сбрасывает несколько других внутренних членов.
Поскольку Process реализует IDisposable
, вы должны всегда вызывать Close()
на нем, когда вы закончите, или обернуть его в блок using
.