异步等待方法比较

4

我正在使用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<string>?在这种情况下,您的代码将无法构建。 - linkerro
如果你从一个async方法中返回任何内容,它会被包装在一个Task中返回。这就是async的工作原理。 - svick
然而,你将其包装在一个任务中没有任何好的理由。 - linkerro
@linkerro 如果你想使用 async,那么你不能不把它包装在一个 Task 中。这是个好理由。如果方法直接返回结果,那么它必须是同步的。在这种情况下,这意味着它会阻塞 UI 线程。 - svick
1个回答

4

区别在于何时调用Dispose()方法。如果不使用await,那么在您开始下载之后,WebClient将会在下载完成之前Dispose()。这在特定情况下可能有效,但不能保证一定有效,因此在这里一定要使用await


谢谢,那很有道理。假设我没有调用实现IDisposable接口的东西,它们会相等吗? - Francis
是的,如果您在finally中没有任何代码在return之后执行(现在由于using而有),那么这两个版本将是相同的。唯一的区别是使用await会更低效。 - svick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接