STATaskScheduler 和 STA 執行緒上的訊息幫浦:仔細觀察
StaTaskScheduler 是 Parallel Extensions Extras 的一個元件,旨在用於 MTA 和 STA 執行緒上的任務調度。 雖然其文件暗示阻止 STA 執行緒上的 TPL 操作利用訊息幫浦機制來防止死鎖,但情況並非總是如此。
具體來說,當使用舊版 STA COM 物件時,BlockingCollection<Task>
中的阻塞操作通常無法觸發訊息泵送。在 STA 執行緒上執行時,此遺漏可能會導致死鎖。
更強大的解決方案是使用自訂同步上下文:
建立自訂同步上下文:
SynchronizationContext.Wait
方法來明確管理訊息幫浦。 MsgWaitForMultipleObjectsEx
和 MWMO_INPUTAVAILABLE
標誌。這允許在信號後檢索訊息,而不會無限期地阻塞。 SynchronizationContext.Wait
實作中手動泵送和發送訊息。 ThreadAffinityTaskScheduler
範例示範了一種解決方案,該解決方案可以解決此死鎖問題,同時在多個 await
延續中保留 STA COM 物件的執行緒關聯性。 它的實現確保了正確的WM_TEST
訊息泵送,從而防止訊息佇列中的死鎖。
以上是StaTaskScheduler 如何安全地與 STA 執行緒和舊版 COM 物件一起使用以避免死鎖?的詳細內容。更多資訊請關注PHP中文網其他相關文章!