我有一个用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)
答案 0 :(得分:2)
你知道调用TerminateProcess
来关闭一个应用程序就像把电源插头从墙上拉下来关闭你的电脑一样,对吧?它并没有很好地问,它没有做正确的事情。它只会强行破坏你的进程。
TerminateProcess
时,它不会得到通知。所以各种各样的东西可能会出错。 Watson博士总结说,这个有是一个bug或其他问题的症状,所以它介入捕获崩溃转储。
您传递的退出代码与此无关。您可以在进程退出后自行检查,但Windows不会对其进行评估。
我的建议不是试图弄清楚Watson博士有时出现的原因,而是找到一种更好的方法来关闭你的申请。如果您提供了有关您的设计的更多详细信息以及您认为首先需要关闭应用程序的原因,我可以提出更好的建议。现在,我所能建议的就是致电Application.Current.Shutdown()
。这可确保您的应用程序以正确的方式关闭,这将使调试器无法被调用。然而,它仍然是一个不可逆转的行动,所以它仍然应该做你想要的。
在Win32术语中,由于这可能是您的母语,因此关闭应用程序的正确方法是先干净地关闭与您的进程关联的所有工作线程,然后调用ExitProcess
函数。请注意,命名 - 退出的重要性是正常操作,终止不是。