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

时间:2012-10-05 22:31:37

标签: c# async-await c#-5.0

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

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

我的问题是,创建表单是否是确保我有同步上下文的最佳/最有效方式,或者是否有更简单的方法来执行此操作。

2 个答案:

答案 0 :(得分:5)

Office应用程序会在STA上下文中调用它们的事件,但它们不提供适当的SynchronizationContext

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

SynchronizationContext.SetSynchronizationContext(
    new WindowsFormsSynchronizationContext());

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

答案 1 :(得分:3)

您可能需要查看this article,其中介绍了如何在没有消息泵的情况下设置SynchronizationContext。请注意,这实际上只有在您希望等待其他工作时才会有用(排队多次回调。)如果您一次只等待一件事,您的代码也可能只是同步运行,因为您不要与你的空闲时间有任何关系,比如运行消息泵。