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 @ 2024-12-22 17:41  [春风十里]  阅读(77)  评论(0)    收藏  举报