using System; using System.Threading.Tasks; namespace netcore2._1_ { class Program { static void Main(string[] args) { for (int i = 0; i < 20; i++) { //M(123); M4(456,i); Console.WriteLine("done:{0}",i); } // Console.WriteLine(456); Console.ReadKey(); } static async Task M(int x,int i) { await Task.Factory.StartNew(e => { Console.WriteLine(x); Task.Delay(1000); }, null); Console.WriteLine("async done:{0}",i); } static void M2(int x,int i) { Task.Factory.StartNew(e => { Console.WriteLine(x); Task.Delay(1000); }, null); Console.WriteLine("task done:{0}",i); } static void M3(int x) { Console.WriteLine(x); } /// <summary> /// 同步方法消费异步方法的接口,采用了状态共享穿越的闭包机制 /// async方法就是一个线程方法,只是这个线程方法可以合并其它的 /// await表达式的线程,产生相同可控的次序执行预期 这就是Task /// 链! /// 本方法通过void同步上下文去使用Task线程调用一个指定的async /// 方法,采用了,传递一个async匿名方法作用委托的方式进行,我们 /// 可以看到,这里并没有任何编译警告,无缝的对接了同步与异步,是 /// 最恰当的同步上下文消费异步async方法的封装! /// </summary> /// <param name="x"></param> /// <param name="i"></param> static void M4(int x,int i) { Task.Run(async() => { await M(x, i); }); } } }
关于async/await对, async就是异步方法相当于一个线程方法,只是被标记了,和以前的Thread.New(...) 差不多啊,被标记为async的方法内容里必须有至少一个await表达式,不然要报错
这就是所谓的async/await对,但是要注意一点,await 可以接受一个其它的 async方法 作为其表达式的内容,但如果仅能这样那么就成了 封闭的环了,就不能使用了,所以你应该注意到await表达式
并不依赖async,它的同步接口是非async的 Task构造的方法,或返回Task的方法,所以 async/await方法都是依赖Task类型的,这个类型是这两个关键字的使用前提和内在基础。
https://blog.csdn.net/u011033906/article/details/62885545?utm_source=blogxgwz2
C# async 方法怎么被正确的消费
猜你喜欢
转载自www.cnblogs.com/ProjectDD/p/9820175.html
今日推荐
周排行