• async异步方法


    在C# 中,可以使用asyc+await来完成一个异步方法

    async用来标志一个使用了await的方法是非阻塞API,是一个异步方法,就当成一个普通关键字就行了。关键是await,await是配合 Task、Task<TResult>或者非阻塞API使用的。它也是多线程操作。await表示等待task的操作,阻塞了这个方法,这个异步方法的内部是线性的,是从上之下的,等执行到await停下来,返回方法的调用方,同时执行调用方接下来的代码和异步方法中的代码。对于异步方法本身来说,方法内部是线性的,但是对于调用异步方法的主体来说,是并行的。

    1、task和async的区别

    场景不同。task用于多线程编程,主要用于与当前线程无关的操作,比如我开一个线程去把队列里面的日志写到本地文件,这个队列可能很长,我直接开一个线程去写就行了,反正我又不用这个写日志这个行为返回什么值;至于async标识一个异步方法,我需要用到这个异步方法的返回值Task<TResult>,但是这个方法中可能执行时间有点长,你先不用等我了去干其它的,你干其它的的同时我计算这个值,我们并行操作,等你用到这个值的时候我没执行完你就接着等,我完成了你就直接用。我们一起工作,肯定不亏。

    2、async代码

    复制代码
     1 /* 
     2     ======================================================================== 
     3         演示功能:
     4         1.async方法内部是线性执行的
     5         2.调用async方法的主体和async方法是并行执行的
     6         3.在使用async返回值时,若async返回了值直接使用,还没有完成就等待完成
     7         总结:
     8         async中代码是顺序执行的,只是执行到await会说我这个操作可能要很长时间,如果你急着用那你就等我完成,如果你不急着用你就先干别的,
     9         你正在干别的时候如果我完成了你想用的时候就直接用,如果你完成了我还没完成那你就接着等我完成。
    10         反正我们是并行的,肯定不亏。
    11     ======================================================================== 
    12 */
    13 using System;
    14 using System.Collections.Generic;
    15 using System.Linq;
    16 using System.Text;
    17 using System.Threading;
    18 using System.Threading.Tasks;
    19 
    20 namespace AsyncDemo
    21 {
    22     class Program
    23     {
    24         public static int a = 0;
    25         static void Main(string[] args)
    26         {
    27             var result = Add();
    28             // 等待3秒输出,说明是在使用值得时候进行等待
    29             // 输出6,说明async是线性执行的
    30             Console.WriteLine(result.Result);
    31             var result2 = Add();
    32             // 再次等待3秒
    33             Thread.Sleep(3000);
    34             Console.WriteLine(1);
    35             Console.WriteLine(result2.Result);
    36             // 同时输出1和6,说明是并行执行的,Add开始沉睡3秒的时候主线程同时沉睡3秒,然后主线程醒了同时result2被赋予了值
    37             Console.Read();
    38         }
    39         public static async Task<int> Add()
    40         {
    41             await Task.Run(() =>
    42             {
    43                 Thread.Sleep(3000);
    44                 a += 3;
    45             });
    46             a = 6;
    47             return a;
    48         }
    49     }
    50 }
    复制代码

    项目工程地址:https://github.com/Beiluola/AsyncDemo

  • 相关阅读:
    MyBatis入门案例
    springboot mybatis 后台框架平台 集成代码生成器 shiro 权限
    原谅这世界没那么美好
    十万的License只取决于一个连接
    Qt连接数据库的两种方法
    桃李春风一杯酒 江湖夜雨十年灯
    ERROR:Can't connect to local MySQL server through socket可能出现的情况
    MySQL忽略授权表方式<--skip-grant-tables>重置管理用户密码
    MySQL5.7和5.6初始化数据的区别
    Rsync同步过程中遇到的常见问题
  • 原文地址:https://www.cnblogs.com/Jeely/p/10983445.html
Copyright © 2020-2023  润新知