9

我最近看到了一些生产代码,效果如下:

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

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

如果不是,那么判断当前进程是否终止的好方法是什么?

如果它可能具有任何相关性,那么它的用例是避免弹出断言,例如在进程被终止时未处理的对象。

4

3 回答 3

3

检查它的源代码,IsExited结果发现并没有什么特别的事情发生。IsExited询问操作系统进程是否已终止以及退出代码是什么。而已。

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

您在那里找到的代码将始终评估为 false。删除它并找出是谁写的,问他的意思。大概是误会吧。

于 2013-08-27T16:06:10.773 回答
1

来自Thread.IsBackground

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

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

至于来自Process.HasExited的声明:

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

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

于 2013-08-27T16:03:04.517 回答
0

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

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

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

于 2013-08-27T15:49:24.047 回答