【问题标题】:C# app getting Watson dialog when calling TerminateProcess调用 TerminateProcess 时 C# 应用程序获取 Watson 对话框
【发布时间】:2013-08-10 13:18:34
【问题描述】:

我有一个用 C# 编写的 WPF 应用程序,当某些事件发生并且应用程序需要关闭时,我正在使用 TerminateProcess()

我不知道为什么,但我看到调用它时偶尔会出现一个 Watson 对话框?这不是 100%

这是例外吗?我传递了一个非 0 结果代码?

为什么 Watson 突然出现,我认为这将是一个无声的退出?

[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool TerminateProcess(IntPtr hProcess, uint uExitCode);

[DllImport("kernel32.dll")]
private static extern IntPtr GetCurrentProcess();

TerminateProcess(GetCurrentProcess(), 2);   <-- this is whats triggering Watson (sometimes)

【问题讨论】:

  • “偶然”有多偶然?
  • 这种harikiri 已经内置在.NET 中,请改用Environment.Exit 或FailFast。很难猜测这是否会有所作为。可能与to this 有关

标签: c# winapi


【解决方案1】:

您知道调用TerminateProcess 关闭应用程序就像将电源插头从墙上拔出以关闭计算机,对吧?它没有很好地询问,也没有做正确的事情。它只是强行将您的进程从内存中删除。

因此,Dr. Watson 调试器将弹出是很有意义的——没有正常运行的应用程序会请求以这种不寻常的方式终止它。您要终止的线程之一可能很忙,没想到地毯会从它下面扯下来。当然,当您拨打TerminateProcess 时不会收到通知。所以这里有各种可能出错的地方。 Watson 博士得出结论,这必须是错误或其他问题的征兆,因此它会介入以捕获故障转储。

您传递的退出代码在这里无关紧要。您可以在进程退出后自行检查它,但 Windows 不会对其进行评估。

我的建议不是尝试找出导致 Watson 博士有时无法出现的原因,而是找到一种更好的方法来关闭您的应用程序。如果您提供了有关您的设计的更多详细信息以及您认为首先需要关闭应用程序的原因,我本可以提出更好的建议。现在,我只能建议致电Application.Current.Shutdown()。这可确保您的应用程序以正确的方式关闭,从而阻止调用调试器。然而,它仍然是一个不可逆转的动作,所以它仍然应该为所欲为。

在 Win32 术语中,由于这可能是您的母语,因此关闭应用程序的正确方法是首先彻底关闭与您的进程关联的所有工作线程,然后调用 ExitProcess 函数。注意命名的意义——exit 是一个正常的动作,terminate 不是。

【讨论】:

  • 在所讨论的情况下,代码试图快速失败,内存中的数据状态不一致,任何进一步的进展都可能损坏。我的确切需求是让每个线程都停止在他们的轨道上
  • @stuck 因此,调试器将被调用是完全合理的。当应用程序崩溃时会发生这种情况。使用全局系统设置将其关闭。不应该在不属于您个人的机器(例如属于客户的机器)上执行此操作。
  • 即使您按照 Hans 的建议并致电 Environment.FailFast,也会编写故障转储。这是预期的行为。唯一真正的解决方案是弄清楚为什么您的应用需要以这种不寻常的方式终止。
  • Cody,感谢您的意见 - 我理解过去所说的,但情况比这里更容易描述 - TerminateProcess() 是正确的技术。终止进程不应调用调试器,不应允许事件泵退出,也不应调用第二次机会异常处理程序。
  • @stuck 我仍然不相信,除了重申你的信念之外,你没有给我任何实际证据证明这是正确的方法。我们永远不会以这种方式达成协议。不过没关系,你不用说服我。不幸的是,您的问题中没有提供足够的信息让我给出更详细的答案。您没有向我们展示的代码显然有问题。您可以通过创建一个简单的应用程序并调用TerminateProcess 来验证该假设;你和我都知道它会很好用。
猜你喜欢
  • 2016-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-28
  • 1970-01-01
相关资源
最近更新 更多