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中文网其他相关文章!