Async/Await

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AwaitAsync
{
    class Program
    {
        static void Main(string[] args)
        {
            AwaitAsync awaitObj = new AwaitAsync();
            //await和async成对出现
            //await 必须出现在asyn修饰的方法中  修饰async方法或者task
            //framework4.5以上
            //await/async是语法糖,由编译器提供

            //主线程遇到await返回执行自己的动作,await之后的动作等待await完成后执行,相当于await这个task的回调
            //多个await可以以同步的方式编写代码,但却不是阻塞的,相当于回调多次

            //async编译后会生成一个状态机(实现IAsyncStateMachine接口)
            //状态机:初始化0--执行变为1---在执行变为0--循环---出现其他状态终止

            //async的逻辑:主线程执行--此时状态机状态为-1--执行await之前的部分,并修改状态机为0---返回
            //             子线程执行--修改状态为0--等待task任务完成--执行await之后的代码
            awaitObj.AwaitTest();
            Console.ReadKey();
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace AwaitAsync
{
    public class AwaitAsync
    {
        public void AwaitTest()
        {
            Console.WriteLine($"**AwaitTest Start {Thread.CurrentThread.ManagedThreadId.ToString("00")}");
            //await Test();//其实async修饰方法默认返回一个task,await其实就是修饰task
            //AwaitNoReturn();
            //CallBack();
            //Test1();
            //{
            //    Task<int> task = AwaitReturnInt();
            //    Console.WriteLine($"result = {task.Result}");
            //}
            {
                Task<int> task = TaskReturnInt();
                Console.WriteLine($"result = {task.Result}");
            }
            Console.WriteLine($"**AwaitTest End {Thread.CurrentThread.ManagedThreadId.ToString("00")}");
        }

        //只有async没有await会报警告,和普通方法没区别
        public async Task Test()
        {
            Console.WriteLine($"Test Start {Thread.CurrentThread.ManagedThreadId.ToString("00")}");

            Console.WriteLine($"Test End {Thread.CurrentThread.ManagedThreadId.ToString("00")}");
        }

        //await和Task Wait的区别
        public async Task Test1()
        {
            Task task = AwaitReturnTask();
            task.Wait();//主线程等待task完成,执行之后的代码,阻塞主线程
            await task;//主线程返回,task执行完成,task之后的代码相当于回调,不阻塞

            Console.WriteLine($"这部分代码Wait()会阻塞  await却不会");
        }

        private async void AwaitNoReturn()
        {
            Console.WriteLine($"AwaitNoReturn Start {Thread.CurrentThread.ManagedThreadId.ToString("00")}");
            //await修饰task
            //遇到await主线程返回,剩余动作等待await执行完成
            await Task.Run(() =>
             {
                 Console.WriteLine($"Task {Thread.CurrentThread.ManagedThreadId.ToString("00")}");
             });

            //这个是剩余动作  等待await完成   相当于task的回调
            Console.WriteLine($"AwaitNoReturn End {Thread.CurrentThread.ManagedThreadId.ToString("00")}");
        }

        //async修饰方法 虽然没有return 但默认返回Task
        private async Task AwaitReturnTask()
        {
            Console.WriteLine($"AwaitNoReturn Start {Thread.CurrentThread.ManagedThreadId.ToString("00")}");
            //await修饰task
            //遇到await主线程返回,剩余动作等待await执行完成
            await Task.Run(() =>
            {
                Console.WriteLine($"Task {Thread.CurrentThread.ManagedThreadId.ToString("00")}");
            });

            //这个是剩余动作  等待await完成   相当于task的回调
            Console.WriteLine($"AwaitNoReturn End {Thread.CurrentThread.ManagedThreadId.ToString("00")}");
        }

        //相当于await
        private void CallBack()
        {
            Console.WriteLine($"AwaitNoReturn Start {Thread.CurrentThread.ManagedThreadId.ToString("00")}");
            Task.Run(() =>
            {
                Console.WriteLine($"Task {Thread.CurrentThread.ManagedThreadId.ToString("00")}");
            }).ContinueWith(t => Console.WriteLine($"AwaitNoReturn End {Thread.CurrentThread.ManagedThreadId.ToString("00")}"));
        }

        //带返回值的await  应用之一  保证子线程对返回值的操作完成
        //async 修饰的,可以返回是个int
        private async Task<int> AwaitReturnInt()
        {
            Console.WriteLine($"AwaitReturnInt Start {Thread.CurrentThread.ManagedThreadId.ToString("00")}");
            int rst = 0;
            await Task.Run(() =>
            {
                for (int i = 0; i < 10000; i++)
                {
                    rst++;
                }
                Thread.Sleep(5000);
            });

            //这个是剩余动作  等待await完成   相当于task的回调
            Console.WriteLine($"AwaitReturnInt End {Thread.CurrentThread.ManagedThreadId.ToString("00")}");
            return rst;
        }

        //对应的类似方法,不过主线程还是会阻塞
        //没有async修饰的  必须返回时task
        private Task<int> TaskReturnInt()
        {
            Console.WriteLine($"TaskReturnInt Start {Thread.CurrentThread.ManagedThreadId.ToString("00")}");
            int rst = 0;
            Task<int> task = Task.Run<int>(() =>
            {
                for (int i = 0; i < 10000; i++)
                {
                    rst++;
                }
                Thread.Sleep(5000);
                return rst;
            });

            //这个主线程循序执行了,并不会像await一样被回调
            Console.WriteLine($"TaskReturnInt End {Thread.CurrentThread.ManagedThreadId.ToString("00")}");
            return task;
        }

    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值