正如我最近发现的那样,在没有同步上下文的情况下执行await
可能会导致在等待在另一个线程上执行之后的代码。
我目前在VSTO办公室加载项中遇到奇怪行为的问题,我认为这可能是此行为的结果。处理Office应用程序引发的事件时,没有适当的同步上下文(除非我创建一个表单,它将创建同步上下文)。
我的问题是,创建表单是否是确保我有同步上下文的最佳/最有效方式,或者是否有更简单的方法来执行此操作。
答案 0 :(得分:5)
Office应用程序会在STA上下文中调用它们的事件,但它们不提供适当的SynchronizationContext
。
解决此问题的最简单方法在我的SynchronizationContext
Odds and Ends博客中进行了解释,我在其中简要介绍了我在为文章进行研究时发现的一些杂项,但其重要性不足以包括在内。要解决此问题,请在每个事件开始时执行以下操作:
SynchronizationContext.SetSynchronizationContext(
new WindowsFormsSynchronizationContext());
之后的任何await
应该在STA线程上恢复。
答案 1 :(得分:3)
您可能需要查看this article,其中介绍了如何在没有消息泵的情况下设置SynchronizationContext。请注意,这实际上只有在您希望等待其他工作时才会有用(排队多次回调。)如果您一次只等待一件事,您的代码也可能只是同步运行,因为您不要与你的空闲时间有任何关系,比如运行消息泵。