Когда 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.