2012-10-05 88 views
5

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

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

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

+0

在这种情况下不会更容易不使用'await'吗?如果你使用的API只是异步的,你可以通过使用Task的Result或Wait()来实现。 – svick

+0

@svick:我想你说的是,如果我想要等待回到同一个线程,那么这就是有效的“同步”行为。嗯...是的,我想是的。 *叹*。说实话,我有点失落了。 –

回答

5

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

解决此问题的最简单方法在我的博客SynchronizationContext Odds and Ends中进行了解释,我简要描述了在为我的文章进行研究时发现的一些杂项内容,但仅仅不够重要。要解决这个问题,在每一个事件的开始,这样做:

SynchronizationContext.SetSynchronizationContext(
    new WindowsFormsSynchronizationContext()); 

任何await年代后应该恢复STA线程上。

+0

请注意任何想做这件事的人 - 另请参阅http://stackoverflow.com/q/12898569/98422 –

3

您可能想看看this article,它描述了如何在没有消息泵的情况下设置SynchronizationContext。请注意,如果您期望有其他您想要等待的工作(排队多个回调),那么这真的很有用。如果您一次只等待一件事,那么您的代码可能会同步运行,你的闲暇时间还没有其他事情要做,比如运行消息泵。

相关问题