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