Async Await (多线程等待) 用写单线程的方式写多线程

 

Task  

n.
任务;(尤指艰巨或令人厌烦的)工作;(尤指语言教学中旨在帮助达到某一学习目的的)活动
vt.
交给某人(任务);派给某人(工作)

 

//async是修饰方法的:---如果只是在方法上写一个async--警告;---而且没有什么用处;

//awai是在方法内部的:---如果只在方法内部写await,没有async---报错
//async+awai配套使用的

//await后的代码会由线程池的线程执行  非阻塞 并发执行   

 //主线程到await这里就返回了,执行主线程任务 ,task中的任务执行完毕以后---继续执行await后面的后续内容,有可能是子线程,也有可能是其他线程,甚至有可能是主线程来执行;

原理是底层状态机的实现 有个 MoveNext方法    

-------------------主线程-------------- 
 private static async void NoReturnNoAwait()
        {
            //主线程执行
            Task task = Task.Run(() =>//启动新线程完成任务
            {
                Thread.Sleep(1000);
                Console.WriteLine($"NoReturnNoAwait Sleep3000 before,ThreadId={Thread.CurrentThread.ManagedThreadId}");
                Thread.Sleep(1000);
                Console.WriteLine($"NoReturnNoAwait Sleep3000 after,ThreadId={Thread.CurrentThread.ManagedThreadId}");
            });

            //主线程执行
            Console.WriteLine($"NoReturnNoAwait Sleep after Task,ThreadId={Thread.CurrentThread.ManagedThreadId}");
        }
------------------子线程无返回值---------
 private static async Task NoReturnTask() //在async/await方法里面如果没有返回值,默认返回一个Task
        {
            //这里还是主线程的id
            Console.WriteLine($"NoReturnTask Sleep before await,ThreadId={Thread.CurrentThread.ManagedThreadId}");

            Task task = Task.Run(() =>
            {
                Console.WriteLine($"NoReturnTask Sleep3000 before,ThreadId={Thread.CurrentThread.ManagedThreadId}");
                Thread.Sleep(1000);
                Console.WriteLine($"NoReturnTask Sleep3000 after,ThreadId={Thread.CurrentThread.ManagedThreadId}");
            });
            await task; //主线程到await这里就返回了,执行主线程任务 ,task中的任务执行完毕以后---继续执行await后面的后续内容,有可能是子线程,也有可能是其他线程,甚至有可能是主线程来执行;
            Console.WriteLine($"NoReturnTask Sleep after await,ThreadId={Thread.CurrentThread.ManagedThreadId}");
            //return;
            //return new TaskFactory().StartNew(() => { });  //不能return  没有async才行
        }

  

continueWith 类似于一个回调  意思是继续但是写的很不方便  这里可以和await task等价替换
/// <summary>
        /// 真的返回Task  不是async  
        /// 
        /// 要使用返回值就一定要等子线程计算完毕
        /// </summary>
        /// <returns>没有async Task</returns>
        private static Task<int> SumFactory()
        {
            Console.WriteLine($"SumFactory 111 start ManagedThreadId={Thread.CurrentThread.ManagedThreadId}");
            TaskFactory taskFactory = new TaskFactory();
            Task<int> iResult = taskFactory.StartNew<int>(() =>
            {
                Thread.Sleep(3000);
                Console.WriteLine($"SumFactory 123 Task.Run ManagedThreadId={Thread.CurrentThread.ManagedThreadId}");
                return 123;
            }).ContinueWith(c=> {
                 
                Thread.Sleep(3000);
                Console.WriteLine($"SumFactory 234 Task.Run ManagedThreadId={Thread.CurrentThread.ManagedThreadId}");
                return 123;

            }).ContinueWith(t=> {

                Thread.Sleep(3000);
                Console.WriteLine($"SumFactory 345 Task.Run ManagedThreadId={Thread.CurrentThread.ManagedThreadId}");
                return 123;
            });

            
            //就是回调来控制线程内部的业务逻辑的执行顺序---不爽
  
            //Console.WriteLine($"This is {iResult.Result}");
            Console.WriteLine($"SumFactory 111   end ManagedThreadId={Thread.CurrentThread.ManagedThreadId}");
            return iResult;
        }

  

posted @ 2021-12-06 11:37  wolfsocket  阅读(146)  评论(0)    收藏  举报