使用带有using块的进程

13

可能重复:
如果我在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 块中;例如MSDN页面上的 Process 没有使用它。使用对象初始化器也是有帮助的。

如果我应该使用它,那么我是否应该去将其“retrofit”到我的现有代码库中?

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


1
谢谢 - 我没看到这个问题。我同意它很相似,但我特别询问的是Dispose()而不是Close()。 - g t
但是那里被接受的答案比这里任何其他答案都要好... :P - rsenna
使用对象初始化程序也很有帮助。即使使用using块,您仍然可以使用对象初始化程序。我知道这个问题很旧了,但是我在.NET 2.0上进行了测试,至少到那时它可以正常工作。 - monkey0506
2个回答

6

如果您不能或不想使用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();
}

1
这是一般规则,但OP询问有关“System.Diagnostics.Process”的具体信息。 - rsenna
我认为,在处理过程中,这个规则同样适用。 - Roy Dictus
@rsenna - 你说得对,然而明确规定这个规则可能会帮助那些不知道为什么在这种情况下应该使用()的人。 - g t

4

MSDN的示例是人为制造的。打开进程句柄的程序一旦启动进程就会退出。当该程序退出时,它打开的任何句柄都会关闭。

如果您打开了进程句柄,那么应该将其关闭。Component.Dispose的Process.Dispose重写只是调用了Process.Close。使用using语句可以简化这个过程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接