Process.HasExit对于当前进程是否可以为真?

时间:2013-08-27 15:37:48

标签: c# .net

我最近看到了一些生效代码:

if (Process.GetCurrentProcess().HasExited)
{
    // do something
}

这有什么意义吗?直观地说,如果进程已经退出,那么就不能在其中运行任何代码。

如果没有,那么判断当前流程是否正在终止的好方法是什么?

如果它具有任何相关性,那么用例就是避免弹出断言,例如在进程被杀死时未处置的对象。

3 个答案:

答案 0 :(得分:3)

检查IsExited的源代码,结果发现没有任何惊人的事情发生。 IsExited询问操作系统是否已终止进程以及退出代码是什么。就是这样。

输出重定向的整个主题不适用。

您在那里找到的代码将始终评估为false。删除它,找出是谁写的,问他的意思。可能是一种误解。

答案 1 :(得分:1)

来自Thread.IsBackground

  

一旦属于某个进程的所有前台线程都已终止,公共语言运行库就会结束该进程。任何剩余的后台线程都会停止并且不会完成。

对我来说,这意味着一旦进程终止,任何线程都不会执行任何代码。

来自Process.HasExited的陈述:

  

当标准输出重定向到异步事件处理程序时,当此属性返回true时,输出处理可能无法完成。要确保已完成异步事件处理,请在检查HasExited之前调用不带参数的WaitForExit()重载。

我不认为这适用,因为异步事件处理程序是当前进程中的线程,如果进程本身必须终止,它们将被终止。它们只有在附加到其他进程时才会执行。

答案 2 :(得分:0)

实际上,您似乎能够构建这样的场景:

请参阅http://msdn.microsoft.com/en-US/library/system.diagnostics.process.hasexited.aspx中的说明:

  

当标准输出重定向到异步事件处理程序时,当此属性返回true时,输出处理可能无法完成。要确保已完成异步事件处理,请在检查HasExited之前调用不带参数的WaitForExit()重载。