Task提高异步执行效率技巧

 更新时间:2022年04月11日 09:43:26   作者:一事冇诚  
这篇文章介绍了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提高异步执行效率技巧的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • WPF实现监听快捷键的方式分享

    WPF实现监听快捷键的方式分享

    这篇文章主要为大家详细介绍了WPF实现监听快捷键的几种方式,文中的示例代码讲解详细,具有一定的借鉴与学习价值,需要的可以了解一下
    2023-03-03
  • C#利用ASP.NET Core开发学生管理系统详解

    C#利用ASP.NET Core开发学生管理系统详解

    随着技术的进步,跨平台开发已经成为了标配,在此大背景下,ASP.NET Core也应运而生。本文主要利用ASP.NET Core开发一个学生管理系统,感兴趣的可以学习一下
    2022-01-01
  • 深入理解c#多态

    深入理解c#多态

    这篇文章主要介绍了c#多态的相关知识,文中代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-06-06
  • 利用C#编写Linux守护进程实例代码

    利用C#编写Linux守护进程实例代码

    如今的编程是一场程序员和上帝的竞赛,程序员要开发出更大更好、傻瓜都会用到软件,下面这篇文章主要给大家介绍了关于利用C#编写Linux守护进程的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下。
    2018-01-01
  • 详解c# 数组(Array)

    详解c# 数组(Array)

    这篇文章主要介绍了c# 数组的的相关资料,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • WPF使用触发器需要注意优先级问题解决

    WPF使用触发器需要注意优先级问题解决

    本文主要介绍了WPF使用触发器需要注意优先级问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • C#波形图控件制作示例程序

    C#波形图控件制作示例程序

    这篇文章主要介绍了C#波形图控件的制作方法,大家参考使用
    2013-11-11
  • 关于C#生成MongoDB中ObjectId的实现方法

    关于C#生成MongoDB中ObjectId的实现方法

    本篇文章小编为大家介绍,关于C#生成MongoDB中ObjectId的实现方法。需要的朋友参考下
    2013-04-04
  • C#绘制飞行棋地图小程序

    C#绘制飞行棋地图小程序

    这篇文章主要介绍了C#绘制飞行棋地图小程序的相关资料,非常不错,具有参考借鉴价值,对c飞行棋地图相关知识感兴趣的朋友一起看看吧
    2016-09-09
  • 详解StackExchange.Redis通用封装类分享

    详解StackExchange.Redis通用封装类分享

    这篇文章主要介绍了详解StackExchange.Redis通用封装类分享 ,详细的介绍了StackExchange.Redis通用封装,具有一定的参考价值,有需要的可以了解一下。
    2016-12-12

最新评论