У меня есть многопоточное приложение .NET, которое висит на событии OnUserPreferenceChanged. Обычно это вызвано тем, что элемент управления пользовательского интерфейса или цикл сообщений запущен в фоновом потоке (см., Например, http://www.ikriv.com/en/prog/info/dotnet/MysteriousHang.html),, но, насколько я могу судить, это не так. Я убедился в этом, задав точку останова в WindowsFormsSynchronizationContext (как предложено здесь http://www.aaronlerch.com/blog/2008/12/15/debugging-ui/) и оно создается только один раз, в основном потоке пользовательского интерфейса.
Вот вывод из! Clrstack в windbg:
0013eea8 7c90e514 [HelperMethodFrame_1OBJ: 0013eea8]
System.Threading.WaitHandle.WaitOneNative (Microsoft.Win32.SafeHandles.SafeWaitHandle,
UInt32, Boolean, Boolean) 0013ef54 792b68af
System.Threading.WaitHandle.WaitOne (Int64, Boolean) 0013ef70 792b6865
System.Threading.WaitHandle.WaitOne (Int32, Boolean) 0013ef84 7b6f1a4f
System.Windows.Forms.Control.WaitForWaitHandle (System.Threading.WaitHandle)
0013ef98 7ba2d68b
System.Windows.Forms.Control.MarshaledInvoke (System.Windows.Forms.Control,
System.Delegate, System.Object [], Boolean) 0013f038 7b6f33ac
System.Windows.Forms.Control.Invoke (System.Delegate, System.Object [])
0013f06c 7b920bd7
System.Windows.Forms.WindowsFormsSynchronizationContext.Send (System.Threading.SendOrPostCallback,
System.Object) 0013f084 7a92ed62
Microsoft.Win32.SystemEvents + SystemEventInvokeInfo.Invoke (Boolean,
System.Object []) 0013f0b8 7a92dc8f
Microsoft.Win32.SystemEvents.RaiseEvent (Boolean, System.Object,
System.Object []) 0013f104 7a92e227
Microsoft.Win32.SystemEvents.OnUserPreferenceChanged (Int32, IntPtr,
IntPtr) 0013f124 7aaa06ec
Microsoft.Win32.SystemEvents.WindowProc (IntPtr, Int32, IntPtr, IntPtr)
Последний метод получения информации о параметрах:
0013f084 7a92ed62
Microsoft.Win32.SystemEvents + SystemEventInvokeInfo.Invoke (Boolean,
System.Object [])
ПАРАМЕТРЫ:
это = 0x01404420
checkFinalization = 0x00000001
args = 0x0144a298
Вот мой вопрос: как я могу получить больше информации здесь? В конечном итоге я хотел бы знать, для каких объектов и / или потоков этот Invoke предназначен. Что-то вроде "! Do 0x01404420" или "! Do 0x0144a298", но я не знаю, куда идти.