Приложение. Выход не убил насос сообщений? - PullRequest
4 голосов
/ 04 декабря 2008

У меня есть обработчик исключений потока, который сохраняет трассировку стека исключений и должен закрыть приложение. Я звоню Applicatoin.Exit, но он закрывает окно, а приложение работает без окон.

Я знаю, что это обычно происходит, потому что некоторые фоновые потоки все еще работают. Я подключил windbg к процессу без окон, и, похоже, есть только два управляемых потока, один из которых выглядит как поток финализатора gc, а второй - как насос сообщений ??? Кто-нибудь это понимает?

Есть ли разница между вызовом Application.Exit и закрытием главного окна пользователем?

0:005> !threads
ThreadCount: 2
UnstartedThread: 0
BackgroundThread: 1
PendingThread: 0
DeadThread: 0
Hosted Runtime: no
                                      PreEmptive   GC Alloc           Lock
       ID OSID ThreadOBJ    State     GC       Context       Domain   Count APT Exception
   0    1  284 002e9668      6020 Enabled  021a7268:021a7fe8 002e4c68     0 STA
   2    2  d48 002f9890      b220 Enabled  00000000:00000000 002e4c68     0 MTA (Finalizer)
0:001> ~0 s
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for 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 Thread 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] 

1 Ответ

10 голосов
/ 04 декабря 2008

Я разобрался. Вместо вызова System.Windows.Forms.Application.Exit () я должен был вызвать System.Windows.Application.Shutdown (). Поток насоса сообщений принадлежит wpf, вы можете увидеть его по трассировке стека этого потока.

Другими словами, System.Windows.Forms.Application.Exit () не закроет насосы сообщений WPF.

...