Task提高异步执行效率技巧

Karli ·
更新时间:2024-09-21
· 139 次阅读

async Task 语法糖出来后,异步编程变得非常简单,适合需要耗费较长时间的任务。

有些小伙伴使用后可能会非常疑惑,使用异步和同步,在耗时上几乎没有差别。

下面我们看一个例子,场景是需要调用多个第三方的WebApi,分别是获取名称、年龄、性别,由于网络环境等原因,api响应时间可能会接近1秒

public async Task Test() { var sw = new Stopwatch(); sw.Start(); var userName = await GetUserNameAsync(); var userAge = await GetUserAgeAsync(); var userSex = await GetUserSexAsync(); sw.Stop(); var ts = sw.Elapsed; Console.WriteLine($"总共耗时:{ts.TotalMilliseconds}ms"); } private async Task<string> GetUserNameAsync() { await Task.Delay(500); return "小明"; } private async Task<string> GetUserAgeAsync() { await Task.Delay(800); return "11"; } private async Task<string> GetUserSexAsync() { await Task.Delay(900); return "11"; }

运行后发现,这个时间2秒多,这用户体验肯定是无法忍受的

导致这样结果的原因是每次进行异步调用的时候,都在异步函数前加上了 await ,对于单单这个过程来说,其实相当于同步,等待直到结果返回,每个异步函数都await,时间自然就叠加了,为了解决这个问题,使用一个小技巧,可以将代码改成下面这样

public async Task Test() { var sw = new Stopwatch(); sw.Start(); var userNameTask = GetUserNameAsync(); var userAgeTask = GetUserAgeAsync(); var userSexTask = GetUserSexAsync(); var userName = await userNameTask; var userAge = await userAgeTask; var userSex = await userSexTask; sw.Stop(); var ts = sw.Elapsed; Console.WriteLine($"总共耗时:{ts.TotalMilliseconds}ms"); } private async Task<string> GetUserNameAsync() { await Task.Delay(500); return "小明"; } private async Task<string> GetUserAgeAsync() { await Task.Delay(800); return "11"; } private async Task<string> GetUserSexAsync() { await Task.Delay(900); return "11"; }

这次运行的总耗时,就是3个异步中,耗时最长那个GetUserSexAsync

为什么会这样呢,这个小技巧的关键是这里,当执行到异步函数的时候,不加 await,不进行等待,让这些任务乖乖在别的线程的执行,当需要用到他们的时候,再去等待返回值,所以时间上不会进行叠加,哪个最长,总耗时就是哪个

var userNameTask = GetUserNameAsync(); var userAgeTask = GetUserAgeAsync(); var userSexTask = GetUserSexAsync(); var userName = await userNameTask; var userAge = await userAgeTask; var userSex = await userSexTask;

到此这篇关于Task提高异步执行效率技巧的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持软件开发网。



技巧 异步执行 异步 效率

需要 登录 后方可回复, 如果你还没有账号请 注册新账号