5

例外スタック トレースを保存し、アプリケーションを閉じる必要があるスレッド例外ハンドラーがあります。私は Applicatoin.Exit を呼び出しますが、それはウィンドウを閉じるだけで、ウィンドウなしでアプリを実行しています。

これは通常、一部のバックグラウンド スレッドがまだ実行されているために発生することを知っています。ウィンドウレス プロセスに windbg をアタッチしましたが、マネージ スレッドは 2 つだけのようです。そのうちの 1 つは GC ファイナライザー スレッドのように見え、2 つ目はメッセージ ポンプのように見えますか??? 誰でもこれを理解していますか?

Application.Exit の呼び出しとユーザーがメイン ウィンドウを閉じることに違いはありますか?

0:005> !スレッド
スレッド数: 2
未開始スレッド: 0
バックグラウンド スレッド: 1
保留スレッド: 0
デッドスレッド: 0
ホステッド ランタイム: いいえ
                                      プリエンプティブ GC 割り当てロック
       ID OSID ThreadOBJ 状態 GC コンテキスト ドメイン カウント APT 例外
   0 1 284 002e9668 6020 有効 021a7268:021a7fe8 002e4c68 0 STA
   2 2 d48 002f9890 b220 有効 00000000:00000000 002e4c68 0 MTA (ファイナライザー)
0:001> ~0 秒
*** エラー: シンボル ファイルが見つかりませんでした。C:\Windows\system32\MSCTF.dll のシンボルをエクスポートするデフォルト -
eax=02162530 ebx=002e9668 ecx=02162530 edx=02162530 esi=0019ef9c edi=0019ee3c
eip=77589a94 esp=0019edcc ebp=0019ede8 iopl=0 nv up ei pl zr na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246
ntdll!KiFastSystemCallRet:
77589a94 c3 ret
0:000> !clrstack
OS スレッド ID: 0x284 (0)
ESP EIP     
0019ef24 77589a94 [ComPlusMethodFrameGeneric: 0019ef24] MS.Win32.UnsafeNativeMethods+ITfMessagePump.GetMessageW (System.Windows.Interop.MSG ByRef, Int32, Int32, Int32, Boolean ByRef)
0019ef44 56d61937 System.Windows.Threading.Dispatcher.GetMessage (System.Windows.Interop.MSG ByRef、IntPtr、Int32、Int32)
0019ef90 56d617e3 System.Windows.Threading.Dispatcher.PushFrameImpl (System.Windows.Threading.DispatcherFrame)
0019efe0 56d616c7 System.Windows.Threading.Dispatcher.PushFrame (System.Windows.Threading.DispatcherFrame)
0019effc 56d6162d System.Windows.Threading.Dispatcher.Run()
0019f008 5533ddb0 System.Windows.Application.RunInternal(System.Windows.Window)
0019f034 5533dbe5 System.Windows.Application.Run(System.Windows.Window)
0019f044 5533d836 System.Windows.Application.Run()
0019f04c 01ea00ad UI.App.Main()
0019f268 79e7c74b [GCFrame: 0019f268]

4

1 に答える 1

10

私はそれを解決しました。System.Windows.Forms.Application.Exit() を呼び出す代わりに、System.Windows.Application.Shutdown() を呼び出す必要がありました。メッセージ ポンプ スレッドは wpf に属しており、そのスレッドのスタック トレースから確認できます。

つまり、System.Windows.Forms.Application.Exit() は WPF メッセージ ポンプを閉じません。

于 2008-12-04T13:37:22.117 に答える