gpt4 book ai didi

c# - WPF 等待从 UI 线程切换

转载 作者:太空宇宙 更新时间:2023-11-03 12:47:08 33 4
gpt4 key购买 nike

我有一个从 UI 线程调用的函数,我正在仔细检查是否是这样

System.Windows.Threading.Dispatcher.FromThread(System.Threading.Thread.CurrentThread)

一切都是从 void 方法调用的,它不能是 async void 因为它有一个 out 参数(来自第 3 方的方法API)。

所以在这个 void 方法中我调用了一个 async 方法,main 方法不必等待,所以我只是运行它而忘记了(计划在 ContinueWith 方法中处理异常,但我还没有做到这一点)。

问题是,当在方法链中对 RestSharp 客户端的 ExecuteTaskAsync 方法执行 await 时,在该行之后,线程被设置为 MTA, SynchronizationContext.Current 也不同。

为什么会这样? await 关键字不应该返回到原始的 SynchronizationContext 吗?为什么 SynchronizationContext.Current 在该调用期间发生变化?

抱歉,没有代码片段,它是更大应用程序的一部分,很难将其片段化,但我现在正在做,所以将添加代码片段。

最佳答案

好的,解决了,提到的第 3 方 API 中的 void 方法正在运行一个具有调度程序的线程,因为

System.Windows.Threading.Dispatcher.FromThread(System.Threading.Thread.CurrentThread)

返回一个调度程序,我不知道为什么,但这没关系,我必须在 Invoke 中运行我的异步方法,比如

Application.Current.Dispatcher.Invoke(() => myAsyncMethod());

然后我方法中的 await 没有切换 SynchronizationContext。看起来我的假设是当有调度员时它的正确上下文是错误的,不知道为什么 :)

关于c# - WPF 等待从 UI 线程切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36898491/

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