关于async await的测试

async await的教程:http://www.javashuo.com/article/p-fgxlmiin-z.htmlhtml

 

异步方法:web

        private async Task<string> TestAsync()
        {
            Console.WriteLine("异步方法开始");
            var task = Task.Run(() =>
            {
                Thread.Sleep(2000);
                Console.WriteLine("在新线程中");
                return "新线程结束";
            });

            var result = await task;
            Console.WriteLine("异步方法结束");

            return result;
        }

调用时不使用await微信

        public IActionResult Index()
        {
            Console.WriteLine("主线程开始");
            Console.WriteLine("输出结果:" + TestAsync());
            Console.WriteLine("主线程结束");
        }

结果:异步

一、主线程+异步方法内await以前的代码按顺序执行async

二、await开始(开新线程)微信支付

三、跳出异步方法(不等待),继续执行主线程后续代码,此时Console.WriteLine("输出结果:" + TestAsync());拿不到TestAsync()的值编码

四、异步方法await执行结束后,异步方法await后的代码继续执行spa


 调用时使用await线程

        public async Task<IActionResult> Index()
        {
            Console.WriteLine("主线程开始");
            Console.WriteLine("输出结果:" + await TestAsync());
            Console.WriteLine("主线程结束");
        }

结果:3d

所有按顺序执行,能够正确拿到返回值


 

async await在winform中的优势是,不卡主线程,而且执行顺序不混乱,但在MVC做用有限,由于web主不结束界面老是无响应的

在MVC中,若是有一种需求,如微信支付后台的交易记录打包下载,在这种需求时,打包下载功能耗时较长,此时咱们但愿网页不等待打包完成,只起到“打包中,稍后查看”的提示做用,那么就能够:

        private Task BagAsync()
        {
            var task = Task.Run(() =>
            {
                Console.WriteLine("打包开始");
                Thread.Sleep(2000);
                Console.WriteLine("打包结束");
            });

            return task;
        }

        public IActionResult Index()
        {
            Console.WriteLine("准备打包");
            BagAsync();
            Console.WriteLine("后台打包中,请稍后查看。");
        }

结果:

 

若是之后,咱们又想等打包结束之后,再显示结果,咱们能够在主方法中加入await等待就行,这样一个打包方法,能够根据调用者的意愿,随时等待或不等待:

        private Task BagAsync()
        {
            var task = Task.Run(() =>
            {
                Console.WriteLine("打包开始");
                Thread.Sleep(2000);
                Console.WriteLine("打包结束");
            });

            return task;
        }

        public async Task<IActionResult> Index()
        {
            Console.WriteLine("准备打包");
            await BagAsync();
            Console.WriteLine("打包成功。");
        }

 结果:

因为BagAsync()方法没有标记async,因此他自己没有await功能,因此在BagAsync方法编写时,在Task.Run以后的方法,将不会等待,必定注意执行顺序!可手动等待。

为何BagAsync不标记async呢?是由于标记了async,可是咱们的需是不想等待时,那么vs编译器,将会有一个提醒,固然,你也可不理它,但老是以为比较烦。

 

被调用的异步方法在编写时,不必定非得要async,也能够只是一个普通的Task方法,由主调用方法来决定是否须要等待。

 

若是一个方法没有使用await,直接调用了一个普通的异步方法(无async标记),那么不会有警告,也不影响执行。

若是一个方法没有使用await,直接调用了一个标记了async的异步方法,那么这个方法自己无需标记async,编译器会有警告,但不影响执行。

若是一个方法使用await,来调用一个标记了async的异步方法或普通异步方法,那么这个方法也须要标记成async,不然没法经过。

若是一个异步方法自己标记了async,代码里却没有await编译器会有的提示,但不影响执行。

 

若是咱们的异步方法没有返回值,并在异步方法内不须要等待,则能够不写成async,不然会在调用时时常会有警告,使人不爽。

若是咱们的异步方法拥有返回值,或在异步方法内须要等待,则能够写成async,不然没法使用await,提高编码复杂度。

async自己是一个语法糖,请灵活使用

相关文章
相关标签/搜索