比较下面两种方法:
static async Task<int> DownloadAsync(string url)
{
var client = new WebClient();
var awaitable = client.DownloadDataTaskAsync(url);
byte[] data = await awaitable;
return data.Length;
}
用法: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);
}
用法:
Task task = new Task(() => Download("http://stackoverflow.com"));
task.Start();
据我所知,这两种方法都是异步运行的。我的问题是:
这两种方法在行为上有什么不同吗?
为什么我们更喜欢 async-await 而不是它是一个很好的模式?
最佳答案
你发的两种方法完全不一样
DownloadAsync
是一种真正的异步方法。这意味着在下载数据时,没有线程阻塞在该异步操作上。
Download
通过调用 Task.Result
同步阻塞调用线程。我在我的博客上解释why Result
should not be used with asynchronous Task
s : 在一般情况下,它会导致死锁。但让我们假设没有死锁。然后您从 TPL 任务调用它,因此它会阻塞任务线程(很可能是线程池线程)。在下载数据时,该任务线程在该异步操作上被阻塞。
因此,DownloadAsync
效率更高。
关于c# - 使用 async/await 是否比使用 task.Start() 更好,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20025858/