使用块使用Process

时间:2011-05-02 13:44:38

标签: c# process coding-style idisposable using-statement

  

可能重复:
  What happens if I don't close a System.Diagnostics.Process in my C# console app?

由于System.Diagnostics.Process继承自实施Component的{​​{1}},我是否应始终使用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的{​​{3}}不使用它。使用对象初始化程序也很有用。

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

如果没有这样做可能会产生什么后果? (假设在每种情况下都正确调用Process。)

2 个答案:

答案 0 :(得分:6)

如果您不使用或不能使用using(),则应确保在不再需要时处理流程变量。

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

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

如果没有_process字段但只有您在方法中使用的过程变量,则必须将其丢弃在方法中:

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

答案 1 :(得分:4)

MSDN示例是设计的。打开进程句柄的程序在启动进程后立即退出。当程序退出时,它打开的任何句柄都会关闭。

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