WPF await 从 UI 线程切换
WPF await switches from the UI thread
我有一个从 UI 线程调用的函数,我正在仔细检查是否是
System.Windows.Threading.Dispatcher.FromThread(System.Threading.Thread.CurrentThread)
一切都是从 void
方法调用的,不能是 async void
因为它有一个 out
参数(来自第 3 方 API 的方法)。
所以在这个 void
方法中我调用了一个 async
方法,主方法不必等待,所以我只是 运行 它并忘记了(计划处理 ContinueWith
方法中的异常,但我还没有。
问题是,当在方法链中对 RestSharp 客户端的 ExecuteTaskAsync
方法执行 await
时,在该行之后,线程被设置为 MTA,SynchronizationContext.Current
也不一样。
为什么会这样? await
关键字 return 不应该是原始 SynchronizationContext 吗?为什么 SynchronizationContext.Current
在调用期间发生变化?
抱歉,没有代码片段,它是更大应用程序的一部分,很难将其片段化,但我现在正在做,所以将添加代码片段。
好的,解决了,提到的来自第 3 方 API 的 void
方法是 运行 具有调度程序的线程,因为
System.Windows.Threading.Dispatcher.FromThread(System.Threading.Thread.CurrentThread)
返回了一个调度程序,我不知道为什么,但这没关系,我不得不 运行 我的异步方法 Invoke
就像
Application.Current.Dispatcher.Invoke(() => myAsyncMethod());
然后我方法中的 await
没有切换 SynchronizationContext
。
看起来我的假设是当有调度员时它的正确上下文是错误的,不知道为什么 :)
我有一个从 UI 线程调用的函数,我正在仔细检查是否是
System.Windows.Threading.Dispatcher.FromThread(System.Threading.Thread.CurrentThread)
一切都是从 void
方法调用的,不能是 async void
因为它有一个 out
参数(来自第 3 方 API 的方法)。
所以在这个 void
方法中我调用了一个 async
方法,主方法不必等待,所以我只是 运行 它并忘记了(计划处理 ContinueWith
方法中的异常,但我还没有。
问题是,当在方法链中对 RestSharp 客户端的 ExecuteTaskAsync
方法执行 await
时,在该行之后,线程被设置为 MTA,SynchronizationContext.Current
也不一样。
为什么会这样? await
关键字 return 不应该是原始 SynchronizationContext 吗?为什么 SynchronizationContext.Current
在调用期间发生变化?
抱歉,没有代码片段,它是更大应用程序的一部分,很难将其片段化,但我现在正在做,所以将添加代码片段。
好的,解决了,提到的来自第 3 方 API 的 void
方法是 运行 具有调度程序的线程,因为
System.Windows.Threading.Dispatcher.FromThread(System.Threading.Thread.CurrentThread)
返回了一个调度程序,我不知道为什么,但这没关系,我不得不 运行 我的异步方法 Invoke
就像
Application.Current.Dispatcher.Invoke(() => myAsyncMethod());
然后我方法中的 await
没有切换 SynchronizationContext
。
看起来我的假设是当有调度员时它的正确上下文是错误的,不知道为什么 :)