当前进程的Process.HasExited是否为true

本文关键字:是否 true HasExited Process 进程 | 更新日期: 2023-09-27 18:29:15

我最近看到一些生产代码的效果是:

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

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

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

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

当前进程的Process.HasExited是否为true

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

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

您在那里找到的代码的计算结果总是为false。去掉它,找出是谁写的,问他是什么意思。可能是误会。

来自Thread.IsBackground:

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

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

至于Process.HasExited:的声明

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

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

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

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

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