C#Async await异步编程

Async await

方法使用Async修饰符修饰.
返回类型仅有三种: void,Task,Task<T>
方法内部使用await关键字标明开始执行异步代码
await标志前的代码是同步执行,await标志的方法是异步执行,await标志的方法后面的代码相当于"回调函数",在await标志的异步方法后面执行.
所以使用Async await异步编程之后代码的执行顺序会变成下面这样:

image

示例

static void Main(string[] args)
{
Console.WriteLine("Let`s Do This!");
Console.WriteLine("I am going to call my son.");
Example e = new Example();
e.AsyncTask();//调用Async修饰的方法
Console.WriteLine("My son is busy now,and I will go on.");
Console.WriteLine("I`m done!");
Console.ReadLine();
}
//Async修饰的方法
public async Task AsyncTask()
{
Console.WriteLine($"我是方法AsyncTask");
var result = await WasteTime();
Console.WriteLine(result);
Console.WriteLine("我已经干完了我应该干的事情!");
}
private async Task<string> WasteTime()
{
return await Task.Run(() =>
{
Thread.Sleep(1);//避免Console.WriteLine执行太快使整个程序执行起来像是同步执行的
Console.WriteLine("我开始异步执行了!");
Console.WriteLine("可是我啥都不想干,还是等个五秒钟就跟主线程说我做好了吧");
Thread.Sleep(5000);
return "我异步执行完了";
});
}

运行效果如下:

Let`s Do This!
I am going to call my son.
我是方法AsyncTask
我开始异步执行了!
My son is busy now,and I will go on.
I`m done!
可是我啥都不想干,还是等个五秒钟就跟主线程说我做好了吧
我异步执行完了
我已经干完了我应该干的事情!

为什么Thread < ThreadPoll

Thread默认创建的是前台线程,每次初始化一个Thread的示例,就会创建一个新的线程!
ThreadPoll默认创建的是后台线程,每次启用线程会从线程池寻找空闲的线程,如果找到了,就会调用这个空闲的线程,而不是直接创建一个新的的线程.
而每次创建一个线程,起码约消耗1M的内存.

因此在需要开启大量线程的情况下,相比于Thread,ThreadPoll具有减少开启新线程消耗的资源,以及统一管理线程的优势!

为什么ThreadPoll < Task

ThreadPool使用的是线程池全局队列,全局队列中的线程依旧会存在竞争共享资源的情况,从而影响性能。
Task基于ThreadPool实现,相当于ThreadPoll的优化版.它不再使用线程池的全局队列,而是使用的本地队列,使线程之间的资源竞争减少。同时Task提供了丰富的API来管理线程、控制。但是相对前面的两种耗内存,Task依赖于CPU对于多核的CPU性能远超前两者,单核的CPU三者的性能没什么差别。

为什么Task < Async await

1.举个例子:
现在需要实现一个,异步写数据库,写成功之后需要在页面上弹出一个小窗提示.
如果你用task.result来实现的话,那么在获取到结果之前,task会使你的项目进去一个阻塞状态.也就是说在小窗弹出来之前,你的程序会一直卡主!从而形成异步编程中的同步阻塞
而Async await则不会发生这种情况.你需要做的仅仅只是在await修饰的方法后面调一个弹出小窗的方法而已.也就是传说中的异步阻塞

2.Async await风格的编程会使代码看起来更像是同步代码,也就更像清新移动更通俗.

转载简书

更多

Microsoft DOC
Microsoft API

posted @   镜子-眼泪  阅读(109)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
欢迎阅读『C#Async await异步编程』

喜欢请打赏

扫描二维码打赏

了解更多

点击右上角即可分享
微信分享提示