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

Использование процесса с использованием блока

Возможный дубликат:
Что произойдет, если я не закрываю System.Diagnostics.Process в моем консольном приложении С#?

Как System.Diagnostics.Process наследует от Component, который реализует IDisposable, должен ли я всегда создавать Process с блоком using?

Например, это...:

using (var process = new Process())
{
    process.StartInfo.FileName = "some process.exe";
    process.Start();
    process.WaitForExit();
}

... вместо этого:

var process = new Process
    { 
        StartInfo = { FileName = "some process.exe" }
    };
process.Start();
process.WaitForExit();

Я спрашиваю, потому что я редко видел Process в блоке using; например, страница MSDN для Process не использует его. Также полезно использовать инициализатор объекта.

Если я должен использовать его, должен ли я пойти и "модифицировать" его на существующую кодовую базу?

Какие могут быть последствия, если это не было сделано? (Предполагая, что WaitForExit() вызывается правильно в каждом случае.)

4b9b3361

Ответ 1

Если вы не используете или не можете использовать using(), вы должны убедиться, что вы удаляете переменную процесса, когда она больше не нужна.

Если вы используете переменную процесса в классе (вместо программы или метода), тогда этот класс должен реализовать IDisposable, а затем вызвать _process.Dispose в своем методе Dispose (bool):

void Dispose(bool disposing)
{
    ...
    if (_process != null)
    {
        Dispose(_process);
    }
}

Если не существует поля _process, а только переменная процесса, которую вы используете в своем методе, вы должны утилизировать ее внутри метода:

void MyMethod()
{
    var process = ...
    ... use it here ...
    process.Dispose();
}

Ответ 2

Пример MSDN изобретателен. Программа, которая открывает дескриптор процесса, уходит, как только начинается процесс. Когда эта программа выходит, все открытые дескрипторы закрываются.

Если вы откроете дескриптор процесса, вы должны закрыть его. Process.Dispose переопределить Component.Dispose просто вызывает Process.Close. Оператор using упрощает это.