对于async和await的使用方式、作用效果不理解 ?没关系,看这篇

2022-12-30 0 600

推论

并行却是触发器,差别如下表所示:

并行:你采用 await 缩排去初始化两个触发器(async)形式(是触发器形式,但是是堵塞式的,可单纯认知为并行);Task,是触发器(后文有标识符实例);能同时实现虚拟化继续执行次序继续执行且不堵塞。

简述

async(C# 参照)

async 是“触发器”的缩写,采用 async 缩排可将形式、lambda 函数或非官方形式选定为触发器。

假如对形式或函数采用此缩排,则其称作触发器形式 。

如下表所示实例表述了两个名叫 ExampleMethodAsync 的触发器形式:

public async Task<int> ExampleMethodAsync() { //… }

await(C# 参照)

await 操作形式符中止对其辖下的 async 形式的解释器,直至其数组则表示的触发器操作形式顺利完成。

触发器操作形式顺利完成后,await 操作形式符将返回操作形式的结果(假如有)。

await 操作形式符应用到则表示已顺利完成操作形式的数组时,它将立即返回操作形式的结果,而不会中止其辖下的形式。

await 操作形式符不会阻止计算触发器形式的线程。

await 操作形式符中止其辖下的触发器形式时,控件将返回到形式的初始化方。

官网说的话是不是听不明白?说实话,你就理解为添加了await 缩排后,必须要等初始化返回后才能继续继续执行下一步。

如下表所示实例:

public async Task<int> ExampleMethodAsync() { //… //这添加了await,继续执行到这里需要等待MethodAwiat形式继续执行顺利完成后才会往下继续继续执行。 int result = await MethodAwiat(); //… } public async Task<int> MethodAwiat() { //… }

促进作用及基本用法

await和async能简化我们触发器编程,也能让我们以一种类似并行编程的形式来进行触发器编程。

另外当我们需要不堵塞主线程触发器继续执行,但又要有次序的继续执行相关标识符的时候,await/async就能排上用场。

基本用法如下表所示实例:

/// <summary> /// 可触发器可并行 /// </summary> /// <returns></returns> public asyncTask<string> TestAsync() { Thread.Sleep(3000); Task<string> task = new Task<string>(() => {return “主程序返回后我还在继续执行数据:我是复杂的触发器继续执行的形式,不阻碍主程序继续执行。。。。。”; }); task.Start(); return await task; } // await 使得任务并行 public async void T1() { // 采用 await 关键字,代表等待继续执行顺利完成,并行 string time = await TestAsync(); Console.WriteLine(time); Console.WriteLine(“继续执行完毕”); } // 直接获得返回的Task,同时实现触发器 public void T2()Task 任务对象,后面的逻辑过程能弄成触发器 Task<string> task = TestAsync(); /Console.WriteLine(“继续执行完毕”); Console.WriteLine(task.Result); }
对于async和await的使用方式、作用效果不理解 ?没关系,看这篇

同时实现虚拟化次序继续执行且不堵塞

以微软文档的做早餐的案例加以简化来讲解 【采用Async和Await能同时实现虚拟化次序继续执行且不堵塞】。

主线任务任务:倒橙汁 -> 烤面包 -> 煎培根 -> 煎鸡蛋 -> 倒咖啡。

1.并行继续执行

我们任务逐步次序继续执行如下表所示,耗时:17064毫秒(17.064秒):

usingMicrosoft.International.Converters.TraditionalChineseToSimplifiedConverter;using System; using System.Diagnostics; using System.Threading; namespace ConsoleApp1 { class Program { static void Main(string[] args) { Stopwatch stopwatch = newStopwatch(); stopwatch.Start(); PourOJ(); PourCoffee(); ToastBread(); FryBacon(); FryEggs(); Console.WriteLine(“早餐已经做完!”); stopwatch.Stop(); Console.WriteLine($”做早餐总计耗时:{stopwatch.ElapsedMilliseconds}); Console.ReadLine(); } //倒橙汁 private static void PourOJ() { Thread.Sleep(1000); Console.WriteLine(“倒一杯橙汁”); } //烤面包 private static void ToastBread() { Console.WriteLine(“开始烤面包”); Thread.Sleep(3000); Console.WriteLine(“烤面包好了”); } //煎培根 private static void FryBacon(){ Console.WriteLine(“开始煎培根”); Thread.Sleep(6000); Console.WriteLine(“培根煎好了”); } //煎鸡蛋 private static void FryEggs() { Console.WriteLine(“开始煎鸡蛋”); Thread.Sleep(6000); Console.WriteLine(“鸡蛋好了”); } //倒咖啡 private static void PourCoffee() { Thread.Sleep(1000); Console.WriteLine(“倒咖啡”); } } }
对于async和await的使用方式、作用效果不理解 ?没关系,看这篇

2.并行继续执行

假如此时我们每一项任务都有两个单独的人去顺利完成,将会缩短时间将近3倍(当然不能单纯的用时间量化他),

如下表所示,耗时6041毫秒(6.041秒):

usingMicrosoft.International.Converters.TraditionalChineseToSimplifiedConverter;using System; usingSystem.Collections.Generic;using System.Diagnostics; using System.Threading; using System.Threading.Tasks; namespace ConsoleApp1 { class Program { static void Main(string[] args) { Test(); Console.ReadLine(); } private static void Test() { Stopwatch stopwatch = newStopwatch(); stopwatch.Start(); List<Task> tasks =newList<Task>() { PourOJ(), ToastBread(), FryBacon(), FryEggs(), PourCoffee() }; Task.WhenAll(tasks).ContinueWith((t) => { Console.WriteLine(“早餐已经做完!”); stopwatch.Stop(); Console.WriteLine($”做早餐总计耗时:{stopwatch.ElapsedMilliseconds}); }); } //倒橙汁 private static asyncTaskPourOJ() { await Task.Delay(1000); Console.WriteLine(“倒一杯橙汁”); } //烤面包 private static async Task ToastBread() { Console.WriteLine(“开始烤面包”); await Task.Delay(3000); Console.WriteLine(“烤面包好了”); }//煎培根 private static async Task FryBacon() { Console.WriteLine(“开始煎培根”); await Task.Delay(6000); Console.WriteLine(“培根煎好了”); } //煎鸡蛋 private static async Task FryEggs() { Console.WriteLine(“开始煎鸡蛋”); await Task.Delay(6000); Console.WriteLine(“鸡蛋好了”); } //倒咖啡 private static async Task PourCoffee() { await Task.Delay(1000); Console.WriteLine(“倒咖啡”); } } }
对于async和await的使用方式、作用效果不理解 ?没关系,看这篇

3.并行且可选定次序继续执行

但是我们不可能每次做早餐都有那么多人同时做,

需求变更:假如现在要求,先倒橙汁,然后倒咖啡,其余的操作形式并行继续执行,应该如何操作形式呢?

只需将以上案例的主线程Test 形式修改如下表所示,其他的不变,耗时8073毫秒(8.073秒):

private static async void Test() { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); awaitPourOJ();//倒橙汁 await PourCoffee(); //然后倒咖啡 List<Task> tasks = newList<Task>() { ToastBread(), FryBacon(), FryEggs() };//子任务List await Task.WhenAll(tasks); //其余的并行操作形式 Console.WriteLine(“早餐已经做完!”); stopwatch.Stop(); Console.WriteLine($”做早餐总计耗时:{stopwatch.ElapsedMilliseconds}); }
对于async和await的使用方式、作用效果不理解 ?没关系,看这篇

总结

我们发现,用好了async和await确实很节省时间。

大家能想想怎么优雅的在触发器里面开多线程(多主线程多子线程)最节省时间。

原文链接:

https://www.cnblogs.com/xiongze520/p/16976940.html

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务