У меня есть обработчик исключений потока, который сохраняет трассировку стека исключений и должен закрыть приложение. Я вызываю 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]





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