当创建新的STA线程来托管STA COM组件时,该线程负责抽取与COM相关的Windows消息。从我能够收集到的内容,某些内置的.NET线程原语(如lock(Monitor.Enter))将在等待对象被另一个线程释放时为您执行此操作。我见过的另一种为你提供.NET泵COM消息的方法是使用.Join()。
在哪里可以找到具有此行为的内置线程基元的完整列表?等待WaitHandle会支持吗?那么WaitAny()或.NET 4中的新并发集合呢?我无法在文档中找到任何具体方法。
答案 0 :(得分:2)
这可以从SSCLI20来源进行一些反向工程,尽管它已经过时了。实现MsgWaitForMultipleHandles的核心CLR函数是DoAppropriateWait。从我看来,它由AutoResetEvent,ManualResetEvent和Semaphore使用,但是Mutex 不。一个怪癖是来自STA线程的WaitHandle.WaitAny是可以的,但WaitAll()会产生异常。是的,除了克里斯布鲁姆博客中的一些提示之外,没有任何记录。你不能从我发现的东西中承担太多,测试这一点是肯定的。