我最近看到了一些生效代码:
if (Process.GetCurrentProcess().HasExited)
{
// do something
}
这有什么意义吗?直观地说,如果进程已经退出,那么就不能在其中运行任何代码。
如果没有,那么判断当前流程是否正在终止的好方法是什么?
如果它具有任何相关性,那么用例就是避免弹出断言,例如在进程被杀死时未处置的对象。
答案 0 :(得分:3)
检查IsExited
的源代码,结果发现没有任何惊人的事情发生。 IsExited
询问操作系统是否已终止进程以及退出代码是什么。就是这样。
输出重定向的整个主题不适用。
您在那里找到的代码将始终评估为false。删除它,找出是谁写的,问他的意思。可能是一种误解。
答案 1 :(得分:1)
一旦属于某个进程的所有前台线程都已终止,公共语言运行库就会结束该进程。任何剩余的后台线程都会停止并且不会完成。
对我来说,这意味着一旦进程终止,任何线程都不会执行任何代码。
来自Process.HasExited的陈述:
当标准输出重定向到异步事件处理程序时,当此属性返回true时,输出处理可能无法完成。要确保已完成异步事件处理,请在检查HasExited之前调用不带参数的WaitForExit()重载。
我不认为这适用,因为异步事件处理程序是当前进程中的线程,如果进程本身必须终止,它们将被终止。它们只有在附加到其他进程时才会执行。
答案 2 :(得分:0)
实际上,您似乎能够构建这样的场景:
请参阅http://msdn.microsoft.com/en-US/library/system.diagnostics.process.hasexited.aspx中的说明:
当标准输出重定向到异步事件处理程序时,当此属性返回true时,输出处理可能无法完成。要确保已完成异步事件处理,请在检查HasExited之前调用不带参数的WaitForExit()重载。