gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 20:23:54 25 4
gpt4 key购买 nike

await由于某种原因,似乎没有在调用上下文中恢复。我调用 async方法(实际上是几个 async 方法的层次结构)。一切顺利,直到我终于到达使用 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 帖子和网络文章,但这似乎不起作用。我还添加了 ConfigureAwait(true)明确要求它在调用上下文时恢复,但它没有。
这是一个 VSTO Word 加载项。我将它与 WPF 一起使用。

最佳答案

This is a VSTO Word add-in.


这实际上是问题的根源。 await 捕获的实际“上下文”是 SynchronizationContext.Current (除非它是 null ,在这种情况下它是 TaskScheduler.Current )。 WinForms 和 WPF 等 UI 应用程序提供了自己的 SynchronizationContext ,这就是 await在 UI 线程上恢复。
除了 Office 加载项。我不知道为什么,但他们不提供 SynchronizationContext .所以如果你想使用 await在 Office 加载项中,您需要提供 SynchronizationContext .
我相信基于 WPF 的 Office 加载项将能够在每个 async 的开头执行此操作。事件:
SynchronizationContext.SetSynchronizationContext(new DispatcherSynchronizationContext());
但我从未真正尝试过这个。 :)

关于c# - await 不会在原始上下文中恢复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65307292/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com