2010-10-11 25 views
2

當創建一個新的STA線程來託管STA COM組件時,該線程有責任抽取與COM相關的Windows消息。從我已經能夠收集的內容來看,某些內置的.NET線程原語(例如lock(Monitor.Enter))會在等待該對象被另一個線程釋放時爲您執行此操作。爲我所見的.NET泵COM消息的另一種方法是使用.Join()。哪些阻止.NET中的線程操作將在阻塞時處理COM消息?

我在哪裏可以找到具有此行爲的內置線程原語的完整列表?等待WaitHandle支持這個嗎?那麼WaitAny()或.NET 4中的新併發集合呢?我無法在文檔中找到任何特定方法。

回答

1

這可以從SSCLI20來源有點反向工程,雖然它是過時的。實現MsgWaitForMultipleHandles的核心CLR函數是DoAppropriateWait。從我看到的情況來看,它被AutoResetEvent,ManualResetEvent和Semaphore使用,但Mutex使用而不是。一個怪癖是WaitHandle.WaitAny可以從STA線程中得到,但WaitAll()會產生一個異常。是的,這在Chris Brumme的博客中沒有任何記載。你不能從我發現的東西中假設太多,測試這一點是肯定的。

+0

非常有幫助,謝謝! – SoftMemes 2010-10-11 16:15:22