【问题标题】:Can Process.HasExited be true for the current process?Process.HasExited 是否适用于当前进程?
【发布时间】:2013-08-27 15:37:47
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 这对我来说很有意义,你有什么问题?
  • 正如我所说,“直观地说,如果进程已经退出,那么它里面就不能运行任何代码。”因此这段代码永远不会运行并且毫无意义。
  • 代码在什么上下文中运行?我的意思是这里的多线程。
  • 这是个好问题。如果进程退出,内存中是否还有存储数据的地方?
  • “弹出断言”? “进程被杀死时对象没有被处理”?这没有意义……把整个事情都拿出来。

标签: c# .net


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    来自Thread.IsBackground

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

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

    至于Process.HasExited的说法:

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

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

    【讨论】:

      【解决方案3】:

      其实你好像可以构建这样的场景:

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

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

      【讨论】:

      • 那是输出处理。该进程在不运行时仍然无法运行代码。
      • 指的是另一个进程,不是你自己的。
      • 好点。我很好奇如果你抓住自己的输出会发生什么?但我必须声明这似乎是一条死胡同……
      • @eFloh:这与重定向任何其他进程的输出没有太大区别。
      • @minitech:你当然是对的,但在那种情况下,HasExited 可能是真的吗?我想没有,因为那个过程仍在执行......
      猜你喜欢
      • 2016-09-02
      • 2014-12-25
      • 2013-01-14
      • 1970-01-01
      • 2015-11-15
      • 2020-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多