NETCORE - 异部编程 async/await

NETCORE - 异部编程 async/await

异步编程的本质就是新开任务线程来处理。

实际上异步编程就是通过Task.Run()来实现的。

 

约定:异步的方法名均以Async结尾。

 

了解线程的人都知道,新开一个线程来处理事务这个很常见,但是在以往是没办法接收线程里面返回的值的。所以这时候就该await出场了,await从字面意思不难理解,就是等待的意思。

await 表达式的意思是:方法在此处需要等待异步操作完成后才能继续向下执行。同时方法将被挂起,控制流返回给方法的调用者

 

async和await呢,返回类型就3种:void、Task、Task<TResult>。

 

1、void

如果在触发后,你懒得管,请使用 void。

void返回类型主要用在事件处理程序中,一种称为“fire and forget”(触发并忘记)的活动的方法。除了它之外,我们都应该尽可能是用Task,作为我们异步方法的返回值。

返回void,意味着不能await该异步方法,即可能出现线程阻塞,并且也无法获取exception抛出的异常,通常这些异常会导致我们的程序失败,如果你使用的是Task和Task<TResult>,catch到的异常会包装在属性里面,调用方法就可以从中获取异常信息,并选择正确的处理方式。

2、Task

你如果只是想知道执行的状态,而不需要一个具体的返回结果时,请使用Task。
与void对比呢,Task可以使用await进行等待新线程执行完毕。而void不需要等待。

3、Task<TResult> 

当你添加async关键字后,需要返回一个将用于后续操作的对象,请使用Task<TResult>。

主要有两种方式获取结果值,一个是使用Result属性,一个是使用await。他们的区别在于:如果你使用的是Result,它带有阻塞性,即在任务完成之前进行访问读取它,当前处于活动状态的线程都会出现阻塞的情形,一直到结果值可用。所以,在绝大多数情况下,除非你有绝对的理由告诉自己,否则都应该使用await,而不是属性Result来读取结果值。

 

 

定义方法: 

        private Task<string> GetPerson1()
        {
            return Task.Run(() =>
            {
                Console.WriteLine("t1: start :"+DateTime.Now.ToLongTimeString());

                Task.Delay(5000).Wait();
                
                Console.WriteLine("t1: end:" + DateTime.Now.ToLongTimeString());

                return "t1 result";
            });
        }

 

 

调用:

        [HttpGet]
        [Route("Get1")]
        public async Task<JsonResult> Get1Async()
        {
            Console.ForegroundColor = ConsoleColor.Red;


            Console.WriteLine("trunk run 1");

            var p1 = await GetPerson1();

            Console.WriteLine("trunk run 2");


            Console.ResetColor();

            return new JsonResult(p1);
        }

 

 结果:

 

 

 

 

 

总结:

1、尽量优先使用Task<TResult>和Task作为异步方法的返回类型。

2、如果用了await则方法必须使用async来修饰,并且是Task的类型。

 

 

 

 

 

项目:NETCORE.AsyncProd
附代码:https://gitee.com/wuxincaicai/NETCORE.git

 

引用:https://blog.csdn.net/weixin_41372626/article/details/105076365

引用:https://www.cnblogs.com/xyh9039/p/11391507.html

 

posted @ 2020-06-09 14:54  无心々菜  阅读(714)  评论(0编辑  收藏  举报