zoukankan      html  css  js  c++  java
  • NETCORE

    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

  • 相关阅读:
    fedora20安装hadoop-2.5.1
    超简单fedora20(linux)下JDK1.8的安装
    解决A program file was not specified in the launch configuration.问题
    java中的四则运算
    spring util命名空间
    java中常用的数据加密算法
    C语言实现栈
    百度ueditor富文本编辑器的使用
    C#进程管理程序实现
    ABP领域层-仓储
  • 原文地址:https://www.cnblogs.com/1285026182YUAN/p/13072651.html
Copyright © 2011-2022 走看看