等待DownloadStringAsync与等待包装DownloadString的任务有什么区别?

use*_*000 0 .net c# asynchronous task async-await

我理解WebClient有一个DownloadStringAsync可以使用的方法

var result = await client.DownloadStringAsync(url); 
Run Code Online (Sandbox Code Playgroud)

而且我想知道那只是做的有什么不同

var result = await new Task<string>(() => client.DownloadString(url));
Run Code Online (Sandbox Code Playgroud)

Ken*_*eth 5

首先,您的第二个示例中有轻微的语法错误.您应该使用Task.Run:

var result = await Task<string>.Run(() => client.DownloadString(url));
Run Code Online (Sandbox Code Playgroud)
  • 第一个示例从DownloadStringAsync当前线程开始,然后释放该线程以执行其他工作.

  • 第二个示例创建一个新线程,然后DownloadString在该线程上同步运行.

一个是否优于另一个取决于是否受TaskCPU限制.在这种情况下,DownloadStringAsync更好,因为它不消耗线程.

DownloadStringAsync网络请求的激活,当它从网络接收到请求已完成的中断时,它会继续,您将收到结果.这意味着在那个时候,没有线程正在积极地等待它.

在其他情况下,在受TaskCPU限制的情况下,它并没有真正有所作为(禁止任何可能存在的小开销)

编辑

正如@ paulo-morgado在他的回答中所说,当你说DownloadStringAsync我想你的意思时DownloadStringTaskAsync.前者不返回,Task所以不能与async/await一起使用.后者是可以等待的.