3

在创建新的 STA 线程来承载 STA COM 组件时,该线程负责泵送与 COM 相关的 Windows 消息。据我所知,某些内置的 .NET 线程原语,例如 lock (Monitor.Enter) 会在等待对象被另一个线程释放时为您执行此操作。我见过的另一种为您制作 .NET 泵 COM 消息的方法是使用 .Join()。

在哪里可以找到具有这种行为的内置线程原语的完整列表?等待 WaitHandle 会支持这个吗?WaitAny() 或 .NET 4 中的新并发集合怎么样?我无法在任何特定方法的文档中找到它。

4

1 回答 1

2

这可以从 SSCLI20 源进行逆向工程,尽管它已经过时了。实现 MsgWaitForMultipleHandles 的核心 CLR 函数是 DoAppropriateWait。据我所知,它被 AutoResetEvent、ManualResetEvent 和 Semaphore 使用,但被 Mutex 使用。一个怪癖是 WaitHandle.WaitAny 在 STA 线程中是可以的,但 WaitAll() 会产生异常。是的,除了 Chris Brumme 的博客中的一些提示外,其他任何地方都没有记录。您不能从我的发现中假设太多,请对此进行测试以确保。

于 2010-10-11T13:04:54.327 回答