进程与使用块的使用

本文关键字:进程 | 更新日期: 2023-09-27 17:54:05

可能重复:
如果我不这样做会发生什么;t关闭C#控制台应用程序中的System.Diagnostics.Process?

由于System.Diagnostics.Process继承自实现IDisposableComponent,我是否应该始终创建一个带有using块的Process

例如,这个…:

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块中;例如,Process的MSDN页面没有使用它。使用对象初始值设定项也很有帮助。

如果我应该使用它,那么我应该去"改装"它到我现有的代码库吗?

如果不这样做会有什么后果?(假设WaitForExit()在每种情况下都被正确调用。(

进程与使用块的使用

如果不使用或不能使用using((,则应确保在不再需要过程变量时对其进行Dispose。

如果在类(而不是程序或方法(中使用过程变量,则该类应实现IDisposable,然后在其Dispose(bool(方法中调用_process.Dispose:

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

如果没有_process字段,而只有您在方法中使用的过程变量,则必须在方法内部处理它:

void MyMethod()
{
    var process = ...
    ... use it here ...
    process.Dispose();
}
MSDN示例是经过设计的。打开进程句柄的程序在启动进程后立即退出。当该程序退出时,它打开的所有句柄都将关闭。

如果打开进程句柄,则应将其关闭。Component.Dispose的process.Dispose重写只调用process.close。using语句简化了这一过程。