gpt4 book ai didi

c# - 使用 async/await 是否比使用 task.Start() 更好,为什么?

转载 作者:太空狗 更新时间:2023-10-30 00:19:29 25 4
gpt4 key购买 nike

比较下面两种方法:

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 Tasks : 在一般情况下,它会导致死锁。但让我们假设没有死锁。然后您从 TPL 任务调用它,因此它会阻塞任务线程(很可能是线程池线程)。在下载数据时,该任务线程在该异步操作上被阻塞。

因此,DownloadAsync 效率更高。

关于c# - 使用 async/await 是否比使用 task.Start() 更好,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20025858/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com