如何在同一线程上执行等待后获得延续



正如我最近发现的那样,在没有同步上下文的情况下执行await可能会导致 await 后的代码在不同的线程上执行。

我目前在 VSTO 办公室加载项中遇到奇怪行为的问题,我认为这可能是这种行为的结果。处理 Office 应用程序引发的事件时,没有同步上下文(除非我创建一个窗体,这将创建同步上下文)。

我的问题是创建表单是确保我拥有同步上下文的最佳/最有效的方法,还是有更简单的方法。

Office 应用确实在 STA 上下文中调用其事件,但它们不提供适当的SynchronizationContext

解决此问题的最简单方法在我的博客SynchronizationContext Odds and Ends中进行了解释,我简要描述了我在为我的文章做研究时发现的一些杂项,但不够重要,无法包括在内。若要解决此问题,请在每个事件的开头执行以下操作:

SynchronizationContext.SetSynchronizationContext(
    new WindowsFormsSynchronizationContext());

之后的任何await都应在 STA 线程上恢复。

您可能想查看这篇文章,它描述了如何在没有消息泵的情况下设置 SynchronizationContext。 请注意,这实际上仅在您希望有其他工作要等待(排队多个回调)时才有用。 如果你一次只等待一件事,你的代码不妨同步运行,因为你与空闲时间没有任何关系,比如运行消息泵。

最新更新