2011-11-25 95 views
1

我有一段時間處於掛起狀態的.NET窗體窗體應用程序。當我把流程轉儲並通過WinDbg/SOS打開它時,它顯示一個線程有一個對kernel32!WaitForMultipleObjectsEx的調用,但我沒有在該特定方法的任何事件對象上調用任何WaitXXX API。在我正在對InvokedRequired和IsDisposed API進行檢查時說過。是否調用InvokedRequired或IsDisposed API在內部調用任何WaitXXX API?爲什麼在這個方法中看到對WaitForMultipleObjectsEx的調用?

這是線程的調用堆棧。

[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] 
+0

爲什麼你不告訴我們當時你的代碼在做什麼? – Gabe

回答

1

Check out this postthis post他們會有所幫助,他們會告訴你所有不同的.NET線程正常通話所以才比較,並找出什麼問題..

編輯:
This great post顯示爲什麼WaitOne API在調用詳細信息時調用以及爲什麼發生掛起。瞭解細節可能會幫助你避免這些掛起。

+0

感謝HaLaBi,我在這裏討論的線程是調用我的一個方法,所以我不認爲這個可以被忽略。儘管我已經閱讀過這個博客。 –

+1

@Palm Snow,檢查編輯。 – 2011-11-25 18:09:16

+0

這篇關於WaitOne API的其他文章真的很有幫助 –

0

有很多.Net方法在內部執行等待。

例如,Control.Invoke將等待事件句柄,直到UI線程運行回調。

+0

這是什麼意思它的應用程序掛在這個調用調用?還有關於如何最好地調用Control.Invoke的任何鏈接/建議/設計模式? –

+0

如果您有死鎖 - 如果UI線程正在等待該線程完成,則會發生這種情況。使用調試器來查看調用堆棧並找出你的代碼正在做什麼。 – SLaks

+0

感謝您的提示。我已經看過!線程命令和所有託管線程的LockCount = 0。同樣,syncBlk輸出也沒有。似乎不是它的僵局。因爲這是我看到的調用我的代碼的唯一託管線程,並處於等待狀態 –

1

Win32(以及.NET)中的許多操作都會阻塞。因爲在所有阻塞的API下實際上是一個帶有等待的異步調用,所以當用戶線程正在等待來自內核線程的某些內容時,這種等待調用是堆棧上的一項常見功能。

更新(現在我看到你的調用堆棧):等待是因爲調用Invoke的線程在返回之前需要等待UI線程完成操作。 WaitForMultipleObjectsEx是任何用戶模式在內核句柄上等待的底層等待API(在這種情況下可能是一個Event對象)。

相關問題