繁体   English   中英

等待不会在主线程上恢复

[英]await does not resume on main thread

背景

几年前我遇到了这个问题,并从 Stephen Cleary 那里得到了这个非常有用的答案 VSTO 加载项的问题是它们没有设置SynchronizationContext ,因此异步调用不会在 UI 线程上恢复,从而导致各种跨线程访问问题。 正如他提到的,解决方案是在调用任何async function 之前手动调用SetSynchronizationContext

从那时起我就一直在使用这种技术,并认为这就是它的全部。 但是今天我看到了一种情况,即使手动设置上下文也不会强制它在调用线程上恢复。

情况

我的 VSTO 加载项包含一个 WPF 窗格(在 CustomTaskPane 内),它绑定到包含多个AsyncRelayCommand属性(来自 WCT)的 ViewModel。 其中一个命令调用我的数据服务,后者又调用 RestSharp 方法从 API 服务器获取数据。

所有这些调用都使用async / await并且所有这些调用都使用ConfigureAwait(false)除了顶层的调用(即命令本身)。 下面是这个调用站点的快照:

在此处输入图像描述

如您所见,我在执行await调用之前手动调用SetSynchronizationContext 它还显示SynchronizationContext.Current在 await 调用后恢复后设置,但不知何故代码仍在工作线程上运行。 我还验证了代码在到达第 259 行时正在 UI 线程上运行,然后再深入到await调用。

我已经在这上面花了很多时间和精力,但无法理解它。 谁能帮我弄清楚我是否遗漏了一些明显的东西?

您需要改用WindowsFormsSynchronizationContext class 的实例。

WindowsFormsSynchronizationContext class提供了Windows Forms的同步机制。

DispatcherSynchronizationContext class 适用于使用两个线程的 WPF 应用程序。 一个线程是用于渲染的后台线程,另一个线程用于 UI。 因此,其他 UI 线程无法访问一个线程中的 UI 元素。 Microsoft 引入了负责多个 UI 线程交互的调度程序。

暂无
暂无

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

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