可能重复:
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
。)
答案 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语句简化了这一点。