我想要Process
Kill
;但有时这会产生InvalidOperationException
,表示该过程已经退出。
为防止异常,我尝试检查进程是否已退出:
if (!p.HasExited)
{
p.Kill();
}
但是,我偶尔也会看到异常。由于该过程与我的代码并行运行,我认为问题可能基本上是竞争条件,即该过程在支票和Kill()
电话之间终止。
在不提出上述异常的情况下杀死进程的正确方法是什么?当然,我可以尝试 - 捕捉有问题的代码,但这似乎不是解决这个问题的最佳方法。
答案 0 :(得分:7)
您无法解决此问题,因为存在内置竞争条件:当您致电p.HasExited
时,该过程可能仍处于活动状态,但是当您的程序出现时调用p.Kill()
它可能已经退出。
单独的进程本质上是一个并发实体,因此您需要某种形式的同步才能解决此竞争条件。但是,如果您不拥有相关流程的代码,则无法解决此问题,因为无法同步监控相关流程和流程本身的程序活动。
你应该无条件地发送杀戮信号,捕获特定的异常,继续前进。
答案 1 :(得分:3)
正确的方法是尝试退出进程并捕获异常。该过程可能在您检查和调用退出之间的时间内结束。