Когда COM-объект создается в потоке STA, поток обычно должен реализовать насос сообщений, чтобы маршрутизировать вызовы с другими потоками (см. здесь).
Можно либо накачивать сообщения вручную, либо полагаться на то, что некоторые, , но не все, операции блокировки потоков будут автоматически перекачивать сообщения, связанные с COM, во время ожидания. Документация часто не помогает в определении того, что (см. этот связанный вопрос).
Как определить, будет ли операция блокировки потоков накачивать сообщения COM на STA?
Частичные списки:
Операции блокировки, которые делают насос *:
-
Thread.Join
-
WaitHandle.WaitOne
/WaitAny
/WaitAll
(WaitAll
не может быть вызван из потока STA, хотя) -
GC.WaitForPendingFinalizers
-
Monitor.Enter
(и поэтомуlock
) - при некоторых условиях -
ReaderWriterLock
- BlockingCollection
Операции блокировки, которые не работают:
-
Thread.Sleep
-
Console.ReadKey
(читайте где-нибудь)
* Примечание Ответ Noseratio, говорящий, что даже операции, которые делают насос, делают это для очень ограниченного нераскрытого набора сообщений, специфичных для COM.