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)
据我所知,两种方法都是异步运行的.我的问题是:
两种方法之间的行为有什么不同吗?
为什么我们更喜欢异步 - 等待其他它是一个很好的模式?
您发布的两种方法完全不同.
DownloadAsync是一种真正的异步方法.这意味着在下载数据时,该异步操作没有阻塞线程.
Download通过调用同步阻塞调用线程Task.Result.我在博客上解释为什么Result不应该与异步Tasks 一起使用:在一般情况下,它可能导致死锁.但我们假设没有僵局.然后,您从TPL任务中调用它,因此它会阻止任务线程(很可能是线程池线程).在下载数据时,该异步操作会阻止该任务线程.
所以,DownloadAsync效率更高.