C# async 方法怎么被正确的消费

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

猜你喜欢

转载自www.cnblogs.com/ProjectDD/p/9820175.html