繁体   English   中英

await 不会在原始上下文中恢复

[英]await does not resume on original context

由于某种原因, await似乎没有在调用上下文中恢复。 我正在调用一个async方法(实际上是几个async方法的层次结构)。 事情 go 很好,直到我最终到达使用 RestSharp 的ExecuteAsync()的 DataService 。 最后的调用如下所示:

IRestResponse Response = await rc.ExecuteAsync(request); //rc is a RestClient object

我已经对其进行了彻底的调试,并且在每个级别,以下行都返回true ,甚至在调用ExecuteAsync之前:

System.Threading.Thread.CurrentThread == System.Windows.Application.Current.Dispatcher.Thread

只有在ExecuteAsync()返回服务器数据后,上面的行才变为false ,表示上面的await没有在调用线程上恢复。 因此,调用此异步操作并且现在想要将返回的数据分配给 UI 的更高层会抛出臭名昭著的 STA 线程异常。

我究竟做错了什么? 我已经烧了几个小时,并且浏览了几个 SO 帖子和 web 文章,但这似乎不起作用。 我还添加了ConfigureAwait(true)以明确要求它在调用上下文时恢复,但它没有。

这是一个 VSTO Word 加载项。 我将它与 WPF 一起使用。

这是一个 VSTO Word 加载项。

这实际上是问题的根源。

await捕获的实际“上下文”是SynchronizationContext.Current (除非它是null ,在这种情况下它是TaskScheduler.Current )。 像 WinForms 和 WPF 这样的 UI 应用程序提供了自己的SynchronizationContext ,这就是await在 UI 线程上恢复的方式。

除了 Office 加载项。 我不知道为什么,但他们不提供SynchronizationContext 因此,如果要在 Office 加载项中使用await ,则需要提供SynchronizationContext

我相信基于 WPF 的 Office 加载项将能够在每个async事件开始时执行此操作:

SynchronizationContext.SetSynchronizationContext(new DispatcherSynchronizationContext());

但我从未真正尝试过这个。 :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM