0

我有一个用 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)
4

1 回答 1

2

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

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

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

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

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

于 2013-08-10T13:46:10.343 回答