C#异步编程的async和await简单了解

常用的多线程写法:

Thread.Start;

ThreadPool.QueueUserWorkItem;

Task.Run;

那async和await又是什么?

async和await就是个语法糖,为了方便控制线程执行顺序;

必须成对出现,若方法标记为async但内部没有await,那就是个同步方法;

await必须写在async标记的方法内部;

async依赖于Task,它本身并不会创建线程,其标记的方法会返回一个Task;

进入async方法,程序仍由主线程执行,执行到await开始task异步,主线程可以去干其他事情了,

await的异步执行完毕后,await后面的代码等同于一个完成后的回调。

所以如果只是需要异步,但不涉及到回调,不需要线程间通信,那不需要用到async/await;

记录几个代码段:

复制代码
 1         public static void DoWork()
 2         {
 3             Console.WriteLine("这里是主线程1");
 4             AMethod();
 5             Console.WriteLine("这里是主线程3");
 6         }
 7         public static async Task<string> AMethod()
 8         {
 9             Console.WriteLine("这里是主线程2");
10             await Task.Run(() =>
11             {
12                 for (int i = 0; i < 1000000; i++) ;
13                 Console.WriteLine("这里是子线程1");
14             });
15             Console.WriteLine("这里是子线程2");
16             return "123";
17         }
View Code
复制代码

换个写法:

复制代码
1         public static void DoWork()
2         {
3             Console.WriteLine("这里是主线程1");
4             var t = AMethod();
5             Console.WriteLine(t.Result + "这里是主线程3,需等待");
6         }
View Code
复制代码

再换个:

复制代码
        public static async void DoWork()
        {
            Console.WriteLine("这里是主线程1");
            var t = AMethod();
            await t;
            Console.WriteLine("这里是子线程3");
        }
View Code
复制代码

await后面的代码不是由主线程执行,我的理解是随机分配的线程执行的;(基于console测试,winform未试)

具体程分配机制我还不太清楚,后续有时间再研究。

 

posted @   [春风十里]  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示