Async/Await 和 Dispatcher 的区别

Posted

技术标签:

【中文标题】Async/Await 和 Dispatcher 的区别【英文标题】:Difference between Async/Await and Dispatcher 【发布时间】:2021-09-20 19:57:08 【问题描述】:

我正在开发一个 WPF 应用程序,我遇到了冻结问题,现在我知道它是一个单线程应用程序,但我对术语感到困惑

简单的术语

我想解释一下我的观点,这样就清楚了我的误解,直到现在我才知道大多数应用程序都是 STA(在 c# 中),并且您必须使用异步编程,这可以很好地涉及

单线程通过优先处理已完成的工作,然后使用工作线程通知 UI 线程繁重的工作已完成,从而转移 UI 线程上的工作 也是一个真正的多线程应用程序,需要创建一个线程来完成其上的任务

我认为在很大程度上我的概念至少是可靠的,至少可以说我缺乏的是应用这些能力

例如,虽然我之前为了启用异步编程,但我们必须使用从 main 方法调用的委托,这演变为委托的分派器切割,进一步演变为异步并等待切割“任何单次使用”的分派器(甚至那个字面关键字)

所以我在函数声明中只使用了“async”词,然后是“task”,然后通过粘贴“await”词等待一些紧张的过程,然后最终用 Task.Run( () => 紧张工作())

但现在我很困惑你必须使用 Dispatcher 这个词,因为 UI 元素只能由 dispatcher 访问,并且使用 Dispatcher.Invoke(IntenseWork()),然后是 Dispatcher.Begininvoke 和 Dispatcher.AsyncIncoke

怀疑:

在这种情况下 async/await 和 task.run 是不够的,甚至在这里使用任务并行库


我提出了问题并进行了研究,并坚持这些结论,这些是我以前的问题

Asynchronous Navigation

Using async and await to achieve asynchronicity in example problem

【问题讨论】:

所以你缺乏对 1) what async is 和 2) why Invoke is required 从不同线程访问 UI 的理解。这些是不相关的概念。涉及不同线程时始终需要调用,无论该线程的参与是否由async 引起。而asyncdoes not必然涉及其他线程,除非你特别要求。 【参考方案1】:

您问的是不同时期的两种不同技术。

常见的问题是 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 只是更方便一点,让你用更少的精力编写更易读的代码。

【讨论】:

感谢您的描述,但这是一个我无法真正理解的问题,必须从视频中理解,对于任何与 WPF 或 C# 苦苦挣扎的人,您必须查看 angelsix, 来解释我的问题,是我误解了UI任务和应变密集任务为一体(这是用c#写的),这也是因为我在执行一些UI操作使用 C# 代码而不是 XAML。 Inshort Dispatcher 仅在适当的地方使用,例如包含在 Task.Run 中,并且在此之上使用 Async 并等待任务,Dispatcher 用于跳回调用线程,这意味着,以及 UI 元素,如按钮或网格,因为这是在 UI 线程上创建的,但是由于我们使用了 Task.run 它跳转到另一个线程 这是视频 1.C# Threads, Tasks, Multi-threading & UI Cross-threading 2.C# The UI Thread and STA 3.C# Tasks Async Await如果你想了解这些就是它 同样顺序观看

以上是关于Async/Await 和 Dispatcher 的区别的主要内容,如果未能解决你的问题,请参考以下文章

promise与async和await的区别

js异步回调Async/Await与Promise区别 新学习使用Async/Await

async和await

async和await

async和await

async和await