首页 > 编程语言 >C# Async Await总结

C# Async Await总结

时间:2022-12-02 19:57:27浏览次数:63  
标签:await Console CurrentThread Thread C# Await 线程 WriteLine Async

公司项目里频繁使用Async Await,所以最近几天看了一些Async/Await的一些文章和教程,有些理解也有些疑惑,先记录下。

控制台示例:

 1         static void Main(string[] args)
 2         {
 3             Console.WriteLine("主线程:" + Thread.CurrentThread.ManagedThreadId);
 4             TestAsync();
 5             Console.WriteLine("GetInfoAsync后 调用线程:" + Thread.CurrentThread.ManagedThreadId);
 6             Thread.Sleep(5000);
 7             Console.ReadLine();
 8         }
 9         public async static Task TestAsync() {
10             Console.WriteLine("await1前 调用线程:" + Thread.CurrentThread.ManagedThreadId);
11             await Task.Run(()=> {
12                 Console.WriteLine("await1 调用线程:" + Thread.CurrentThread.ManagedThreadId);
13                 Thread.Sleep(5000);
14             }); 
15             Console.WriteLine("await1后 调用线程:" + Thread.CurrentThread.ManagedThreadId);
16             await Task.Run(() => {
17                 Console.WriteLine("await2 调用线程:" + Thread.CurrentThread.ManagedThreadId);
18                 Thread.Sleep(5000);
19             });
20             Console.WriteLine("await2后 调用线程:" + Thread.CurrentThread.ManagedThreadId);
21         }

运行结果:

通过运行结果可以看出代码的运行顺序。主线程会进入TestAsync方法,此时并没有异步。

当主线程1遇到第一个await时,一方面主线程1会返回Main方法继续执行后边的代码,另一方面会有新线程3执行await关键字后边的代码,两方面互不影响,并行运行。

await关键字后边的 Task.Run本身就是个异步方法,会有新线程执行。

await起到的作用是释放主线程、等待异步方法(await关键字后边的Task.Run)执行结束。

异步方法(await关键字后边的Task.Run)执行结束后,(从运行结果看还是执行Task.Run的线程3)会继续执行后续代码。

执行到第二个await时也是释放当前线程3,await等待新线程4执行异步方法Task.Run,异步方法执行结束后线程4继续执行后续代码。

 

不使用async await时,也运行下用以比较:

 1         static void Main(string[] args)
 2         {
 3             Console.WriteLine("主线程:" + Thread.CurrentThread.ManagedThreadId);
 4             Test();
 5             Console.WriteLine("GetInfoAsync后 调用线程:" + Thread.CurrentThread.ManagedThreadId);
 6             Thread.Sleep(5000);
 7             Console.ReadLine();
 8         }
 9 
10         public static void Test() {
11             Console.WriteLine("await1前 调用线程:" + Thread.CurrentThread.ManagedThreadId);
12             Task.Run(() => {
13                 Console.WriteLine("await1 调用线程:" + Thread.CurrentThread.ManagedThreadId);
14                 Thread.Sleep(5000);
15             });
16             Console.WriteLine("await1后 调用线程:" + Thread.CurrentThread.ManagedThreadId);
17              Task.Run(() => {
18                 Console.WriteLine("await2 调用线程:" + Thread.CurrentThread.ManagedThreadId);
19                 Thread.Sleep(5000);
20             });
21             Console.WriteLine("await2后 调用线程:" + Thread.CurrentThread.ManagedThreadId);
22         }

运行结果:

 

 

总结:

1,await关键字可以使后边代码异步,不阻塞主线程

2,用同步方式(看起来是同步,执行顺序一目了然)写异步代码

3,频繁释放线程,增加程序吞吐性

4,asp.net程序、winform和WPF程序会有死锁问题

5,底层原理可反编译查看

6,C#5.0语法糖

 

疑惑:一个asnyc方法里写多个await有什么意义

 

参考:C#异步编程async/await用法详解

 

标签:await,Console,CurrentThread,Thread,C#,Await,线程,WriteLine,Async
From: https://www.cnblogs.com/returnfalse/p/16945463.html

相关文章

  • __call__函数详解
    来自  https://blog.csdn.net/weixin_43702920/article/details/107832807   传送门__call__(self,) 该方法的功能类似于在类中重载() 运算符,使得类实例对......
  • acwing 152. 城市游戏
     #include"bits/stdc++.h"usingnamespacestd;constintN=1e3+3;intn,m,a[N][N],s[N][N];intA;intw[N],h[N],pp;voidsov(intx){inti,ans=0......
  • 记一次cenos7安装nginx
    安装依赖yum-yinstallgccgcc-c++makelibtoolzlibzlib-developensslopenssl-develpcrepcre-devel 下载Nginx安装包wget-chttps://nginx.or......
  • Codeforces Round #832 (Div. 2)
    A.TwoGroups(CF1747A)题目大意给定一个整数数组\(a\),要求将\(a\)分成两部分\(s1,s2\),要求两部分的和的绝对值的差最大。即最大化\(|\sum(s_1)|-|\sum(s_2)|\)......
  • Docker安装
    官方参考文档:InstallDockerEngineonDebian设置存储库下载所需工具:sudoaptupdate&&sudoaptinstallca-certificatescurlgnupglsb-release-y添加Dock......
  • Mac Homebrew 安装
    1、Makesureyou'veinstalledBrew,withthis(waituntilitsdoneinstalling)(Edit:addedendingquotetotheend)/bin/bash-c"$(curl-fsSLhttps://raw.git......
  • CSS边框,定位 ,浮动,溢出 盒子模型
    CSS(2)边框标签都有边框,我们可以通过css来调整边框。#左边框border-left-width:3px;边框粗细可以配颜色color样式style粗细width上下左右只需要在border......
  • 前端之css
    目录边框display盒子模型浮动溢出定位z-index简易博客页面搭建边框border-left-width:5px;border-left-style:dotted;dotted-定义点线边框border-left-color:#0......
  • webSocket基本使用
    //创建ws实例,建立连接(ws://121.40.165.18.8800有广告)    varws=newWebSocket('wss://javascript.info/article/websocket/demo/hello')    //......
  • #yyds干货盘点# LeetCode程序员面试金典:字符串压缩
    题目:字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串......