0

特定のイベントが発生し、アプリをシャットダウンする必要があるときに TerminateProcess() を使用している C# で記述された WPF アプリケーションがあります。

理由はわかりませんが、これが呼び出されると時々 Watson ダイアログ ボックスが表示されます。100%ではない

これは例外ですか?0 以外の結果コードを渡していますか?

なぜワトソンが飛び出しているのですか?

[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ことは、コンピュータをシャットダウンするために壁から電源プラグを抜き差しするようなものだということを知っていますよね? それはうまく尋ねず、正しいことをしません。プロセスをメモリから強制的に削除するだけです。

したがって、ワトソン博士のデバッガーがポップアップすることは十分に理にかなっています。正しく機能しているアプリケーションが、このような異常な方法で終了するように要求することはありません。終了しようとしているスレッドの 1 つはおそらくビジーで、その下からじゅうたんがはぎ取られるとは予想していませんでした。もちろん、呼び出しても通知されませんTerminateProcess。したがって、ここでうまくいかない可能性のあるあらゆる種類のものがあります。ワトソン博士は、これはバグまたはその他の問題の症状であるに違いないと結論付け、クラッシュ ダンプを取得するために介入します。

ここでは、渡す終了コードは関係ありません。プロセスが終了した後に自分で検査できますが、Windows によって評価されません。

私の提案は、ワトソン博士が表示されない理由を突き止めようとするのではなく、アプリケーションを閉じるより良い方法を見つけることです。デザインの詳細と、最初にアプリを閉じる必要があると思われる理由を提供していただければ、より良い提案ができたはずです。今のところ、私が提案できるのは に電話することだけですApplication.Current.Shutdown()これにより、アプリケーションが正しい方法でシャットダウンされ、デバッガーが呼び出されなくなります。ただし、これは元に戻すことのできないアクションであるため、必要に応じて実行する必要があります。

Win32 の用語では、おそらくそれがあなたの母国語であるため、アプリケーションをシャットダウンする正しい方法は、最初にプロセスに関連付けられているすべてのワーカー スレッドを完全にシャットダウンしてから、ExitProcess関数を呼び出すことです。命名の意味に注意してください。exit は通常のアクションですが、terminate はそうではありません。

于 2013-08-10T13:46:10.343 に答える