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

Chr*_*ips 19 .net c# kill process

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

鉴于此设置,我是否还需要调用.Close()Process 的方法?如果是这样,我应该.Close()在之前还是之后打电话.Kill()

Ste*_*idi 13

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

所以回答你的问题:

是的,请Close()通过Dispose()直接调用方法或通过C#using构造调用,如下所示.

using(Process proc = CreateProcess())
{
    StartProcess(proc);
    if (!proc.WaitForExit(timeout))
    {
        proc.Kill();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 请重新说明关于一次性的声明 - GC和`IDisposable`之间没有直接的关系.如果您调用dispose,那么该类应该释放GC无法清除的所有非托管资源.如果您释放任何托管资源(例如终止对它们的引用),那么GC运行的时间和方式仍然无效. (3认同)
  • 尽管Close()在这里并不是那么重要,因为Kill()将清理内部非托管资源,为使用块清除+1. (2认同)

Kev*_*ock 12

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

由于Process实现IDisposable,你应该Close()在完成后调用它,或者将它包装在一个using块中.


归档时间:

查看次数:

7920 次

最近记录:

15 年,2 月 前