Почему я вижу вызов WaitForMultipleObjectsEx в этом методе? - PullRequest
1 голос
/ 25 ноября 2011

У меня есть приложение формы Windows .NET, которое время от времени переходит в состояние зависания.Когда я взял дамп процесса и открыл его через WinDbg / SOS, он показал, что у одного потока есть вызов kernel32!WaitForMultipleObjectsEx, хотя я не вызываю API WaitXXX для какого-либо объекта события в этом конкретном методе.Это было сказано в рамках я проверяю API InvokedRequired и IsDisposed.Вызывает ли какой-либо из API-интерфейсов InvokedRequired или IsDisposed внутренний интерфейс WaitXXX?

Вот стек вызовов для потока.

[HelperMethodFrame_1OBJ: 0e4eedc0] System.Threading.WaitHandle.WaitOneNative(Microsoft.Win32.SafeHandles.SafeWaitHandle, UInt32, Boolean, Boolean)  
0e4eee6c 67b7689f System.Threading.WaitHandle.WaitOne(Int64, Boolean)  
0e4eee88 67b76855 System.Threading.WaitHandle.WaitOne(Int32, Boolean)  
0e4eee9c 65c21a4f System.Windows.Forms.Control.WaitForWaitHandle(System.Threading.WaitHandle)  
0e4eeeb0 65f5d68b System.Windows.Forms.Control.MarshaledInvoke(System.Windows.Forms.Control, System.Delegate, System.Object[], Boolean)  
0e4eef50 65c233ac System.Windows.Forms.Control.Invoke(System.Delegate, System.Object[])  
0e4eef84 65c2334f System.Windows.Forms.Control.Invoke(System.Delegate)  
0e4eef88 6715ad76 MyNameSpace.MyClass.MyMethod()  
0e4eefb0 67b96e96 System.Threading.ThreadHelper.ThreadStart_Context(System.Object)  
0e4eefbc 67ba031f System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)  
0e4eefd4 67b96e14 System.Threading.ThreadHelper.ThreadStart()  
0e4ef1fc 68f81b4c [GCFrame: 0e4ef1fc]   

Ответы [ 3 ]

1 голос
/ 25 ноября 2011

Многие операции в Win32 (и, следовательно, .NET) будут блокироваться. Поскольку все API-интерфейсы блокировки на самом деле представляют собой асинхронный вызов с ожиданием, такие вызовы ожидания являются общей функцией стеков, когда пользовательский поток ожидает чего-то из потока ядра.

Обновление (теперь я вижу ваш стек вызовов) : ожидание связано с тем, что поток, который вызывает Invoke, должен дождаться завершения потока пользовательского интерфейса, прежде чем вернуться. WaitForMultipleObjectsEx является базовым API ожидания для любого пользовательского режима ожидания на дескрипторе ядра (в этом случае, вероятно, объект Event).

1 голос
/ 25 ноября 2011

Проверьте этот пост и этот пост они будут полезны. Они покажут вам все обычные вызовы для различных потоков .NET, поэтому просто сравните и выясните, в чем проблема., EDIT: Этот замечательный пост показывает, почему WaitOne API вызывается при вызове в деталях, и почему происходят зависания.Знание деталей может помочь вам избежать этих зависаний.

0 голосов
/ 25 ноября 2011

Существует множество методов .Net, которые выполняют внутреннее ожидание.

Например, Control.Invoke будет ожидать дескриптор события, пока поток пользовательского интерфейса не выполнит обратный вызов.

...