113

在 .Net 4.5 中,Microsoft 添加了新Async/Await功能以简化异步编码。然而,我想知道

  1. 可以Async/Await完全替代旧的使用方式 Threads吗?
  2. Async/Await能力做任何Thread可以异步做的事情吗?
  3. 只能Async/Await与某些方法一起使用,WebClient.DownloadStringAsync或者我可以转换任何同步方法以使其使用Async/Await而不阻塞主线程?
4

3 回答 3

84

它可以完全取代使用线程的旧方式吗?

不,线程可以做更多有用的事情。Await 专门用于处理需要时间的事情,最典型的是 I/O 请求。传统上是在 I/O 请求完成时通过回调完成的。编写依赖这些回调的代码非常困难,await 大大简化了它。

能够做任何线程可以异步做的事情吗?

大致。Await 只负责处理延迟,否则它不会做任何线程所做的事情。await 关键字右侧的await表达式是完成工作的内容。理想情况下,它根本不使用线程,它发布一个驱动程序请求,一旦驱动程序完成数据传输,它就会生成一个完成通知回调。到目前为止,网络是最常见的用法,数百毫秒的延迟很常见,并且服务从桌面或 LAN 转移到“云”是不可避免的副作用。同步使用这样的服务会使 UI 反应迟钝。

只能与 WebClient.DownloadStringAsync 等一些方法一起使用

不,您可以将它与任何返回任务的方法一起使用。XxxxAsync() 方法只是 .NET 框架中为需要时间的常见操作而预先准备好的方法。就像从 Web 服务器下载数据一样。

于 2013-03-01T02:34:02.083 回答
16

官方对此的说法。尽管在盲目地将一件事替换为另一件事之前,您应该了解线程和异步编程之间的区别。

于 2013-03-01T02:12:56.190 回答
4

我是这样考虑的(如果您查看https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2012/hh191443(v=vs.110 ),我认为微软也会这样做)#线程)

Async/await 是一种在主应用程序线程上运行一些代码的快速方法,其优点是代码可以在没有工作时暂停自己并将焦点返回到主线程,当主线程出现时“唤醒”主线程是要获得的结果,然后将处理传递回 - 你猜对了 - 主线程。可以把它想象成 Basic 中基于事件的 GOTO 语句,它可以将控制权来回传递给特定的执行行。

相比之下,线程是一个单独的执行流,可以使用自己的变量等运行,其中 - 给定足够的硬件 - 执行与主线程并行发生。

如果您有一个 GUI 应用程序要下载单个文件,然后在下载该文件时对该文件执行某些操作 - 我将使用 async/await 方法来实现它。

但是,如果您的 GUI 需要下载 5000 个文件 - 我将创建一个文件下载线程来处理该问题,因为主 GUI 线程可能会在转移执行以处理下载文件时冻结。

于 2019-02-27T09:49:16.357 回答