整理:C#中async与await异步方法的示例

目的:了解异步方法async、await的写法和执行步骤

一、执行代码如下

class Program
    {
        static void Main(string[] args)
        {
            //  Do:开始主线程
            Debug.WriteLine("Step 1");


            //  Do:调用异步方法
            Task t = BeginRead();

            //  Do:注册异步方法返回时触发的方法
            t.ContinueWith(l => Debug.WriteLine("Step 4"));

            //  Do:执行主线程
            while (true)
            {
                Debug.WriteLine("Working");
                Thread.Sleep(1000);
            }
        }
        
       static async Task BeginRead()
        {

            Thread.Sleep(3000);

            Debug.WriteLine("Step 2");

            //  Do:使用await等待一个线程(在此过程中,返回到了主线程中,但没有触发Task.Continue方法)
            await Task.Run(()=>
            {
                int count = 3;

                while (count>0)
                {
                    Thread.Sleep(3000);
                    Debug.WriteLine("await...");
                    count--;
                }
            });

            //  Do:当await执行完后才继续执行下面方法
            Thread.Sleep(3000);

            Debug.WriteLine("Step 3");

        }
    }

二、输入结果如下:

Step 1
Step 2
Working
Working
Working
await...
Working
Working
Working
await...
Working
Working
Working
await...
Working
Working
Working
Step 3
Step 4
Working
Working
Working

三、执行过程说明

1、由输出结果可见执行的步骤是按照Step严格执行的

2、调用await前的语句执行的是在上一个线程中执行,在await后面中执行的则是在新线程中执行的,即Step2虽然在async方法中,但是是在主线程中执行,await后面的则会异步执行;

3、值得注意的是异步方法返回的Task.ContinueWith任务则是在await后面所有代码都执行完才执行

4、如果async中没有加await会出现async中所有步骤都是在主线程中执行

猜你喜欢

转载自blog.csdn.net/u010975589/article/details/83415362