【问题标题】:Difference between Task.Run and CLR async method?Task.Run 和 CLR 异步方法之间的区别?
【发布时间】:2017-04-24 20:52:19
【问题描述】:

请告诉我,这两种方法有什么区别?两者是否会运行async?在await之后的流中会做什么?

public async Task<ActionResult> RunAsync()
{
   var client = new WebClient();
   await client.DownloadDataAsync(someUri);

   return _jsonDataResult;
}

public async Task<ActionResult> RunAsync()
{
   var client = new WebClient();

   await Task.Run(()=> 
   {
      client.DownloadData(someUri);
   });

   return _jsonDataResult;
}

使用第二种方法有意义吗?

【问题讨论】:

  • 这个问题可能对你有帮助 - stackoverflow.com/questions/18013523/…
  • @DavidPine 我没有注意到问题文本提出的问题与标题不同。并且没有原生 API,您的意思是 原生异步 API。这个问题显示了LOT 的混乱,例如为什么await Task.Run 而不是return Task.Run?甚至是await client.DownloadDataAsync(); 而不是return client.DownloadAsync()
  • 实际上,在查看源代码时——WebClient 甚至没有将.DownloadDataAsync 公开为Task 返回方法。因此,不能等待!
  • WebClient 遵循为 TAP 使用 TaskAsyn 后缀方法的推荐模式,因为它已经为 EAP 提供了 Task 后缀方法。

标签: c# asp.net-mvc asynchronous async-await


【解决方案1】:

请告诉我,这两种方法有什么区别?

第一个异步下载一些数据。第二个同步下载一些数据(阻塞线程池线程直到下载完成)。

两者是否会异步运行?

嗯,这取决于您对“异步”的定义。我会说第一个是“真正的异步”,第二个是“假异步”。

在等待单词之后的流中会做什么?

是的,不知道这个问题是什么意思。此时流已被读取。

使用第二种方法有意义吗?

不,除非您在同步执行方面遇到问题。例如,DNS 查找可能很慢,而且它们通常通过异步 API 同步完成(IMO 的设计错误)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多