c# - Async/Await 和 Dispatcher 的区别
问题描述
我正在开发一个 WPF 应用程序,但遇到了冻结问题,现在我了解到它是一个单线程应用程序,但我对术语感到困惑
我简单的术语
Async/Await 和 Dispatcher 的区别
我想解释一下我的观点,所以它的两端都清楚我的误解,直到现在我已经了解到大多数应用程序是 STA(在 c# 中),并且您必须使用异步编程,这很好地涉及
- 一个单一的线程,通过优先处理已经完成的工作,然后使用工作线程通知 UI 线程繁重的工作已经完成,从而转移 UI 线程上的工作
- 也是一个真正的多线程应用程序,需要创建一个线程来完成其上的任务
我认为在大多数情况下,我的概念至少是可靠的,至少可以说我缺乏的地方是应用这些能力
例如,我虽然以前为了启用异步编程,我们必须使用从 main 方法调用的委托,这演变为委托的调度程序切割,进一步演变为异步并等待切割“任何单次使用”调度程序(即使是文字关键词)
所以我在函数声明中只使用了“async”词,然后是“task”,然后通过粘贴“await”词等待一些紧张的过程,然后最后用 Task.Run(() = 封装紧张的工作> 激烈的工作())
但现在我很困惑你必须使用 Dispatcher 这个词,因为 UI 元素只能由 dispatcher 访问,并使用 Dispatcher.Invoke(IntenseWork()),然后是 Dispatcher.Begininvoke 和 Dispatcher.AsyncIncoke
怀疑:
在这种情况下 async/await 和 task.run 是不够的,甚至在这里使用任务并行库
我提出了问题并进行了研究,并坚持这些结论,这些是我以前的问题
解决方案
您正在询问来自不同时期的两种不同技术。
常见的问题是 UI 是单线程的,只能从主 (UI) 线程访问。
您可以并且应该尽可能将非 UI 工作卸载到另一个线程。但是通常有结果需要在之后显示。
旧的(但仍然有效)方法是将委托交给 Dispatcher.Invoke() 或 WinForms 中的 Control.Invoke()。
适用于 Task.Run() 和所有 DoSomethingAsync() I/O 方法的较新方法是使用 await:
// use async void only for eventhandlers
async void LoadButton_Click(object s, RouteEventArgs e)
{
// get input from controls here
var results = await Task.Run(() => HeavyWorkWithoutUI());
// update UI with results here
}
WPPF 和 WinForms 支持是您的顶级方法将在等待之前和之后在 UI 线程上运行。重方法将在另一个线程上运行。在等待期间,您的 UI 保持响应。
所以 await 只是更方便一点,让你用更少的精力写出更易读的代码。
推荐阅读
- events - 在大查询中重命名事件参数
- python - tf.selectV2的目的和约束是什么
- mule - 基于属性给定误差的动态范围
- microsoft-graph-api - Microsoft Graph 文档状态
- nginx - 没有证书的 Nginx 代理安全
- json - ARM mbed os 蜂窝无法使用 tcp/udp 连接龙板
- c# - Sprache 如何处理多行延续值
- http - Http 和 TCP/IP 的区别
- javascript - 在.post函数Node.JS中依次调用两个异步函数
- excel - 如何通过 Excel VBA Chart.Export 设置图像选项