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 }
换个写法:
1 public static void DoWork() 2 { 3 Console.WriteLine("这里是主线程1"); 4 var t = AMethod(); 5 Console.WriteLine(t.Result + "这里是主线程3,需等待"); 6 }
再换个:
public static async void DoWork() { Console.WriteLine("这里是主线程1"); var t = AMethod(); await t; Console.WriteLine("这里是子线程3"); }
await后面的代码不是由主线程执行,我的理解是随机分配的线程执行的;(基于console测试,winform未试)
具体程分配机制我还不太清楚,后续有时间再研究。

浙公网安备 33010602011771号