Async/Await和Dispatcher之间的区别



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

I简单术语

Async/Await和Dispatcher之间的区别

我想解释一下我的观点,让它从两端都清楚地表明我的误解,直到现在我已经了解到大多数应用程序都是STA(在c#中(,并且你必须使用异步编程,这很可能涉及

  • 一个单独的线程,通过对已经完成的工作进行优先级排序,然后使用工作线程通知UI线程繁重的工作已经完成,来转移UI线程上的工作
  • 也是一个真正的多线程应用程序,其中需要创建一个线程来完成任务

我认为在大多数情况下,我的概念至少是坚实的,至少可以说,我缺乏的是应用这些能力

例如,我认为以前为了实现异步编程,我们必须使用从主方法调用的委托,这演变成了对委托的调度器切割,这进一步演变成了异步和等待切割"ANY SINGLE use of"调度器(甚至是字面关键字(

所以我用的都是";异步;单词在函数的声明中,后面跟着";任务";,然后通过粘贴";等待";单词之前,它最终用Task封装了紧张的工作。Run(((=>IntenseWork((

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

怀疑:

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


我问了一些问题并进行了研究,我对这些结论感到困惑,这些是我以前的问题

异步导航

在实例问题中使用异步和等待实现异步

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

常见的问题是UI是单线程的,只能从主(UI(线程访问。

您可以并且应该尽可能多地将非UI工作卸载到另一个线程。但通常有一些结果需要在之后显示。

旧的(但仍然有效(方法是将委托交给WinForms中的Dispatcher.Invoke((或Control.Invoke((。

适用于Task.Run((和所有DoSomethingAsync((I/O方法的较新方法是使用wait:

// 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线程上运行。heavy方法将在另一个线程上运行。在等待期间,您的UI保持响应。

所以wait只是稍微方便一点,让您可以毫不费力地编写可读性更强的代码。

最新更新