如果我用.Kill()杀死System.Diagnostics.Process,我是否还需要调用.Close()?

时间:2011-04-12 23:54:51

标签: c# .net process kill

使用C#4.0,我创建了一个System.Diagnostics.Process,我希望花费很短的时间来运行。如果由于某种原因,该过程在一段时间后没有退出(例如,我称之为.WaitForExit(timeout)并且返回值为false),我需要清理。我已经决定在这种特殊情况下使用.Kill()是安全的(没有我担心腐败的数据结构)。

鉴于此设置,我是否还需要调用进程的.Close()方法?如果是,我应该在.Close()之前或之后致电.Kill()吗?

2 个答案:

答案 0 :(得分:13)

System.Diagnostics.Process通过IDisposable类实施Component,受保护的Dispose(bool)方法调用Close()。在完成这些资源时,通常认为处理一次性资源是一种好习惯,因为这将立即释放与该类相关的任何资源(无需等待GC运行)。

所以回答你的问题:

是的,请直接致电Close()方法或通过C#Dispose()结构致电using,如下所示。

using(Process proc = CreateProcess())
{
    StartProcess(proc);
    if (!proc.WaitForExit(timeout))
    {
        proc.Kill();
    }
}

答案 1 :(得分:12)

Process.Kill()Process.Close()都在内部调用与该进程关联的私有SafeProcessHandle对象上的Close()。但是,Process.Close()也明确重置了其他几个内部成员。

由于流程实现了IDisposable,因此在完成后应始终在其上调用Close(),或将其包装在using块中。