对于异步编程Await和Async的理解

 public class AsyncInSync
    {
        /// <summary>
        /// 同步代码里有异步代码
        /// 
        /// 
        /// 结果
        /// Main Thread Before DelayAsync:1
        /// DelayAsync Before Await Thread ID:1
        /// DelayReturnTaskAsync Before Await Thread ID:1
        /// Main Thread After DelayAsync:1
        /// DelayReturnTaskAsync After Await Thread ID:4
        /// DelayAsync After Await Thread ID:4
        /// </summary>
        static public void Test()
        {
            Console.WriteLine("Main Thread Before DelayAsync:" + Thread.CurrentThread.ManagedThreadId);

            DelayAsync(10000);

            Console.WriteLine("Main Thread After DelayAsync:" + Thread.CurrentThread.ManagedThreadId);
        }

        /// <summary>
        /// 异步代码里有异步代码
        /// 
        /// 
        /// 异步方法里有同步代码执行顺序:
        /// 1 当前线程:进入DelayAsync方法
        /// 2 当前线程:同步执行Thread.Sleep(1000);
        /// 3 当前线程:(发现async里有await)当前线程返回DelayAsync的调用方向下执行。
        /// 4 其他线程:执行await后的函数和Thread.Sleep(2000);)
        ///  
        /// 在异步方法中:Await之前的执行还是调用的线程,Await之后的执行就是另一个线程了
        /// 即:异步方法中,Await之前还是当前线程的同步方法
        /// 
        /// </summary>
        /// <param name="ms"></param>
        /// <returns></returns>
        static async void DelayAsync(int ms)
        {
            Thread.Sleep(1000);
            Console.WriteLine("DelayAsync Before Await Thread ID:" + Thread.CurrentThread.ManagedThreadId);
            await DelayReturnTaskAsync(ms);
            Console.WriteLine("DelayAsync After Await Thread ID:" + Thread.CurrentThread.ManagedThreadId);
            Thread.Sleep(2000);
        }

        /// <summary>
        /// 异步代码里有异步代码
        /// </summary>
        /// <param name="ms"></param>
        /// <returns></returns>
        static async Task DelayReturnTaskAsync(int ms)
        {
            Thread.Sleep(1000);
            Console.WriteLine("DelayReturnTaskAsync Before Await Thread ID:" + Thread.CurrentThread.ManagedThreadId);
            await Task.Delay(ms);
            Console.WriteLine("DelayReturnTaskAsync After Await Thread ID:" + Thread.CurrentThread.ManagedThreadId);
            Thread.Sleep(2000);
        }


    }