Подтвердить что ты не робот

Если я убью System.Diagnostics.Process с .Kill(), мне также нужно вызвать .Close()?

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

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

4b9b3361

Ответ 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.