如何指定优先级在WPF Dispatcher线程调用异步函数?
在WPF Dispatcher线程以指定优先级调用异步函数
核心解决方案
直接将异步方法作为Func<Task<T>>传入Dispatcher.InvokeAsync,通过Unwrap()展开嵌套的Task,或者连续await两次来获取最终结果:
修改后的Bar方法示例
async Task<SomeOtherResult> Bar() { ... // 方式1:用Unwrap()扁平化嵌套Task SomeResult result = await dispatcher.InvokeAsync(Foo, someDispatcherPriority).Unwrap(); // 方式2:连续await两次,效果完全一致 // Task<Task<SomeResult>> nestedTask = dispatcher.InvokeAsync(Foo, someDispatcherPriority); // SomeResult result = await await nestedTask; ... }
原理说明
Dispatcher.InvokeAsync支持传入返回Task的委托,此时它会返回Task<Task<T>>:外层Task代表“将异步方法调度到UI线程执行”的操作完成,内层Task才是Foo方法自身的执行结果。- 通过
Unwrap()或连续await,可以直接等待Foo的完整执行流程,包括其内部的异步切换(比如await Task.Run切到线程池,完成后自动切回UI线程继续后续ViewModel修改)。 - 整个
Foo方法的启动执行会严格遵循你指定的DispatcherPriority在UI线程触发。
无返回值异步方法的调用示例
如果异步方法不返回结果,逻辑完全一致:
async Task FooWithoutResult() { // UI线程操作 ... await Task.Run(() => SomeIoCallAsync()); // 后续UI操作 ... } async Task Bar() { ... await dispatcher.InvokeAsync(FooWithoutResult, someDispatcherPriority).Unwrap(); ... }
内容的提问来源于stack exchange,提问作者TN.
相关产品推荐
相关产品推荐

