async await

吃可爱长大的小学妹 提交于 2019-12-01 08:09:30

用于处理IO消耗的多线程

        static void Main(string[] args)
        {
            var info = Hello().Result;

            Console.WriteLine(info);

            Console.Read();
        }

        static async Task<string> Hello()
        {
            //主线程执行,底层还会调用一个 AwaitUnsafeOnCompleted 委托给线程池
            Console.WriteLine("hello world");

            //在工作线程中执行
            var x = await Task.Run(() =>
              {
                  Console.WriteLine("i'm middle");

                  return "i'm ok";
              });

            Console.WriteLine("我是结尾哦:{0}", x);

            return x;
        }

  

  • AsyncTaskMethodBuilder: 扮演了一个TaskcomplationSource一个角色,就是做Task的包装器。
  • state:扮演者状态机状态的角色,记录当前状态
  • AwaitUnsafeOnCompleted :这个函数是丢给线程池去执行的,当某一时刻执行结束,会调用Movenext
    class Program
    {
        static void Main(string[] args)
        {
            var info = Hello();

            Console.WriteLine("我去: " + info.Result);

            Console.Read();
        }

        static Task<string> Hello()
        {
            MyStateMachine machine = new MyStateMachine();

            //类似TaskCompletionSource,包装器
            machine.t_builder = AsyncTaskMethodBuilder<string>.Create();            

            machine.state = -1;

            var t_builder = machine.t_builder;

            t_builder.Start(ref machine);

            return machine.t_builder.Task;
        }
    }

    public class MyStateMachine : IAsyncStateMachine
    {
        public AsyncTaskMethodBuilder<string> t_builder;

        public int state;

        private MyStateMachine machine = null;

        private TaskAwaiter<string> myawaiter;

        string result = string.Empty;

        public MyStateMachine()
        {
        }

        public void MoveNext()
        {
            try
            {
                switch (state)
                {
                    case -1:
                        Console.WriteLine("hello world");

                        var waiter = Task.Run(() =>
                        {
                            Console.WriteLine("i'm middle");

                            return "i'm ok";
                        }).GetAwaiter();

                        state = 0;  //设置下一个状态
                        myawaiter = waiter;

                        machine = this;

                        //丢给线程池执行了。。。
                        t_builder.AwaitUnsafeOnCompleted(ref waiter, ref machine);
                        break;

                    case 0:

                        var j = myawaiter.GetResult();

                        Console.WriteLine("我是结尾哦:{0}", j);

                        t_builder.SetResult(j);
                        break;
                }
            }
            catch (Exception ex)
            {
                t_builder.SetException(ex);  //设置t_builder的异常
            }
        }

        public void SetStateMachine(IAsyncStateMachine stateMachine)
        {
        }
    }

  

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!