异步/等待与线程

异步/等待与线程

问题描述:

在.Net 4.5中微软增加了新的Async/Await功能来简化异步编码。不过,我不知道异步/等待与线程

  1. Async/Await完全替代使用 Threads的老路上?
  2. Async/Await能够做任何异步Thread可以做 异步吗?
  3. 可以Async/Await只能用于一些方法,如WebClient.DownloadStringAsync或我可以转换任何同步方法,使其使用Async/Await而不是阻止主线程?
+2

线程和异步/等待是不相关的功能。你可以将它们合并,但你不必。 – dtb 2013-03-01 01:30:02

+1

我认为Async/Await和'new Thread(()=> {Some Work})做同样的事情。不是吗? – 2013-03-01 01:34:14

+1

没有。你的假设是不正确的。您可能会考虑[Task.Run](http://msdn.microsoft.com/en-us/library/hh195051.aspx)(TPL),它通常与Async/Await结合使用,但也是不相关的不必与它一起使用。 – dtb 2013-03-01 01:37:34

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

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

能够做任何一个线程可以异步执行的操作吗?

粗略地。等待只是处理延迟,它不会做任何线程。等待表达式,await关键字的右边是什么使得工作完成。理想情况下,它根本不使用线程,它发布驱动程序请求,一旦驱动程序完成数据传输,它将生成完成通知回调。网络是迄今为止最常见的用法,数百毫秒的延迟是常见的,并且是从桌面或局域网到“云”的服务的不可避免的副作用。同步使用这些服务会使UI非常反应。

只能用一些方法,如WebClient.DownloadStringAsync

号你可以返回任务的任何方法,用它来使用。 XxxxAsync()方法在.NET框架中仅用于需要时间的常见操作。就像从网络服务器下载数据一样。

+4

在现代C#方面,在外部API上实现异步回调的最佳方法是什么? – bonCodigo 2014-05-19 05:13:20

+4

在最后一段中介绍,使用任务。 – 2015-04-26 12:24:46

+0

我希望线程可以做的事情不能通过异步编程来完成。 – 2016-01-24 03:59:20

The official statement on this.虽然您应该先理解线程和异步编程之间的区别,然后再盲目地将其中一件事替换掉。

+0

这就像我读过的关于线程和异步/等待的第一个资源,它清晰简洁。 – 2015-01-07 17:19:17

+0

此答案只包含文档的链接。由于链接可能会过时,答案可能会过时 - 甚至更糟 - 完全无用。我们鼓励Stack的用户将链接的相关部分直接发布到他们的问题中。 – HimBromBeere 2018-02-19 15:52:12