欢迎光临
我们一直在努力

Task怎么提高异步执行效率

本篇内容介绍了“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怎么提高异步执行效率”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注云搜网网站,小编将为大家输出更多高质量的实用文章!

赞(0)
【声明】:本博客不参与任何交易,也非中介,仅记录个人感兴趣的主机测评结果和优惠活动,内容均不作直接、间接、法定、约定的保证。访问本博客请务必遵守有关互联网的相关法律、规定与规则。一旦您访问本博客,即表示您已经知晓并接受了此声明通告。