使用async/await比使用task.Start()更好吗?为什么?

Ger*_*ard 4 c# task async-await

比较以下两种方法:

static async Task<int> DownloadAsync(string url)
{
    var client = new WebClient();
    var awaitable = client.DownloadDataTaskAsync(url);
    byte[] data = await awaitable;
    return data.Length;
}
Run Code Online (Sandbox Code Playgroud)

用法: Task<int> task = DownloadAsync("http://stackoverflow.com");

static Task<int> Download(string url)
{
    var client = new WebClient();
    var task = client.DownloadDataTaskAsync(url);
    byte[] data = task.Result;
    return Task.FromResult(data.Length);
}
Run Code Online (Sandbox Code Playgroud)

用法:

Task task = new Task(() => Download("http://stackoverflow.com"));
task.Start();
Run Code Online (Sandbox Code Playgroud)

据我所知,两种方法都是异步运行的.我的问题是:
两种方法之间的行为有什么不同吗?
为什么我们更喜欢异步 - 等待其他它是一个很好的模式?

Ste*_*ary 7

您发布的两种方法完全不同.

DownloadAsync是一种真正的异步方法.这意味着在下载数据时,该异步操作没有阻塞线程.

Download通过调用同步阻塞调用线程Task.Result.我在博客上解释为什么Result不应该与异步Tasks 一起使用:在一般情况下,它可能导致死锁.但我们假设没有僵局.然后,您从TPL任务中调用它,因此它会阻止任务线程(很可能是线程池线程).在下载数据时,该异步操作会阻止该任务线程.

所以,DownloadAsync效率更高.