【问题标题】:async await method comparison异步等待方法比较
【发布时间】:2013-01-25 14:46:01
【问题描述】:

我开始使用 TPL,并且有一个关于在标记为异步的被调用方法中调用 await 的重要性的问题,而不是等待调用未设为异步的方法的调用函数.

private async void Button_Click_1(object sender, RoutedEventArgs e)
{
    TBox.Text += await WebClientDownloader();
    TBox.Text += await WebClientDownloadWithAwait(); 
}

private async static Task<string> WebClientDownloadWithAwait()
{
    using (var wc = new WebClient())
    {
        return await wc.DownloadStringTaskAsync("http://google.com");
    }
}

private static Task<string> WebClientDownloader()
{
    using (var wc = new WebClient())
    {
        return wc.DownloadStringTaskAsync("http://google.com");
    }
}

有区别吗?它们的表现似乎相同。

【问题讨论】:

  • 是我还是等待 DownloadStringTaskAsync 的结果会返回实际响应而不是 Task?在这种情况下,您的代码将无法构建。
  • @linkerro 如果您从async 方法返回任何内容,则返回包裹在Task 中。这就是async 的工作原理。
  • 不过,你将它包装在一个任务中是没有充分理由的。
  • @linkerro 如果您想使用async,您不能将其包装在Task 中。这就是充分的理由。如果方法直接返回结果,它必须是同步的。在这种情况下,这意味着它会阻塞 UI 线程。

标签: .net asynchronous task-parallel-library async-await


【解决方案1】:

区别在于Dispose()被调用的时间。如果您不使用await,那么WebClient 在您开始下载之后和下载完成之前之前Dispose()d。它可能在您的特定情况下有效,但不能保证有效,因此您绝对应该在此处使用await

【讨论】:

  • 谢谢,这是有道理的。假设我没有调用实现 IDisposable 的东西,它们会是平等的吗?
  • 是的,如果您在finally 中没有任何在您的return 之后执行的代码(感谢using),那么这两个版本将是相同的。唯一的区别是使用await 效率会降低。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-19
相关资源
最近更新 更多