繁体   English   中英

异步/等待 vs 线程

[英]Async/Await vs Threads

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

  1. Async/Await完全取代旧的Threads使用方式吗?
  2. Async/Await能够执行Thread可以异步执行的任何操作?
  3. Async/Await只能与WebClient.DownloadStringAsync等某些方法一起使用,或者我是否可以转换任何同步方法以使其使用Async/Await而不会阻塞主线程?

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

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

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

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

只能与某些方法一起使用,例如 WebClient.DownloadStringAsync

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

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

我是这样考虑的(如果您查看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 线程可能会冻结。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM