这篇文章介绍了Task提高异步执行效率的技巧,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
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提高异步执行效率技巧的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持得得之家。
本文标题为:Task提高异步执行效率技巧
- C# 使用Aspose.Cells 导出Excel的步骤及问题记录 2023-05-16
- Unity3D实现渐变颜色效果 2023-01-16
- Unity Shader实现模糊效果 2023-04-27
- 如何使用C# 捕获进程输出 2023-03-10
- .NET CORE DI 依赖注入 2023-09-27
- c# 模拟线性回归的示例 2023-03-14
- user32.dll 函数说明小结 2022-12-26
- WPF使用DrawingContext实现绘制刻度条 2023-07-04
- Oracle中for循环的使用方法 2023-07-04
- 在C# 8中如何使用默认接口方法详解 2023-03-29