.NET为什么要使用异步(async)编程?

有几点坐下笔记

⭐⭐⭐⭐:

1. 同步方法

static void Main(string[] args)
{
Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ms")}:开始");
// 调用同步方法
SyncTestMethod();
Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ms")}:结束");
Console.ReadKey();
} /// <summary>
/// 同步方法
/// </summary>
static void SyncTestMethod()
{
for (int i = ; i < ; i++)
{
var str = $"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ms")}:SyncTestMethod{i}";
Console.WriteLine(str);
Thread.Sleep();
}
}

控制台打印:

-- :: :开始
-- :: :SyncTestMethod0
-- :: :SyncTestMethod1
-- :: :SyncTestMethod2
-- :: :SyncTestMethod3
-- :: :SyncTestMethod4
-- :: :SyncTestMethod5
-- :: :SyncTestMethod6
-- :: :SyncTestMethod7
-- :: :SyncTestMethod8
-- :: :SyncTestMethod9
-- :: :结束

主线程在调用同步方法时,会直接在主线程中执行同步方法,这个时候若SyncTestMethod方法后面还有其它方法,都需要等待SyncTestMethod执行完成。(就是要有个先来后到)

2. 异步方法

static void Main(string[] args)
{
Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ms")}:开始");
// 调用异步步方法
AsyncTestMethod();
Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ms")}:结束");
Console.ReadKey();
} /// <summary>
/// 异步方法
/// </summary>
/// <returns></returns>
static async Task AsyncTestMethod() {
await Task.Run(() => {
for (int i = ; i < ; i++)
{
Console.WriteLine($"AsyncTestMethod");
Thread.Sleep();
}
});
}

控制台打印:

2019-03-26 14:52:37 5237:开始
2019-03-26 14:52:37 5237:结束
2019-03-26 14:52:37 5237:AsyncTestMethod
2019-03-26 14:52:37 5237:AsyncTestMethod
2019-03-26 14:52:37 5237:AsyncTestMethod
2019-03-26 14:52:37 5237:AsyncTestMethod
2019-03-26 14:52:37 5237:AsyncTestMethod
2019-03-26 14:52:37 5237:AsyncTestMethod
2019-03-26 14:52:37 5237:AsyncTestMethod
2019-03-26 14:52:37 5237:AsyncTestMethod
2019-03-26 14:52:37 5237:AsyncTestMethod
2019-03-26 14:52:37 5237:AsyncTestMethod

 

主线程在调用异步方法时,默认还是会在主线程中执行,但是如果异步方法中使用了
Task.Run(()=>{}) 这种方式执行异步任务,异步任务将会在一个独立的线程去执行异步方法,
调用过AsyncTestMethod方法之后,不会阻塞主线程并直接执行AsyncTestMethod后面的主线程其它方法(就是把异步的程式给另外一个人做,个人干个人的,互相不干扰),
这个时候主线程也不会等待异步方法执行完成。
并且这个时候主线程无法知晓异步方法会在什么时候执行完成(两个人不知道谁先干完,谁啥时候干完),
所以此时也无法在主线程中直接获取异步方法的返回,

⭐⭐⭐⭐如果需要在异步方法执行完成之后再在主线程中执行其它方法,则需要使用Wait()来等待异步任务执行完成。⭐⭐⭐⭐

3. 等待(awiat)异步方法

static void Main(string[] args)
{
Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ms")}:开始");
// 调用异步步方法
AsyncTestMethod();
// 等待异步方法执行完成
m1.Wait();/////////////////////////////////////这里出现awit这个关键字,就是主线程,等待异步线程完成
Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ms")}:结束");
Console.ReadKey();
} /// <summary>
/// 异步方法
/// </summary>
/// <returns></returns>
static async Task AsyncTestMethod() {
await Task.Run(() => {
for (int i = ; i < ; i++)
{
Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ms")}:AsyncTestMethod");
Thread.Sleep();
}
});
}

控制台打印:

2019-03-26 14:55:51 5551:开始
2019-03-26 14:55:51 5551:AsyncTestMethod
2019-03-26 14:55:51 5551:AsyncTestMethod
2019-03-26 14:55:51 5551:AsyncTestMethod
2019-03-26 14:55:51 5551:AsyncTestMethod
2019-03-26 14:55:51 5551:AsyncTestMethod
2019-03-26 14:55:51 5551:AsyncTestMethod
2019-03-26 14:55:51 5551:AsyncTestMethod
2019-03-26 14:55:51 5551:AsyncTestMethod
2019-03-26 14:55:51 5551:AsyncTestMethod
2019-03-26 14:55:51 5551:AsyncTestMethod
2019-03-26 14:55:51 5551:结束

  

主线程在调用异步方法时,由于使用了Task.Run(()=>{}) 创建异步任务,所以异步任务会在一个独立的线程去执行,
然后在调用AsyncTestMethod方法之后执行了对AsyncTestMethod方法的等待Wait(),这个时候主线程会等待异步方法执行完成,不会执行后续的方法,
在AsyncTestMethod执行完成之后,等待结束,此时可以拿到异步方法AsyncTestMethod的返回值(就是加了awit的作用,让主线程等待异步线程)
然后再继续执行主线程中的后继方法。

 

.NET为什么要使用异步(async)编程?⭐⭐⭐⭐⭐的更多相关文章

  1. 异步(async)编程

    思考:为什么要使用异步编程? 我们先看看同步方法和异步方法之前在程序中执行的逻辑: 1. 同步方法 static void Main(string[] args) { Console.WriteLin ...

  2. 同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式

    1. 概念理解        在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:   同步/异步主要针对C端: 同步:    ...

  3. python异步IO编程(一)

    python异步IO编程(一) 基础概念 协程:python  generator与coroutine 异步IO (async IO):一种由多种语言实现的与语言无关的范例(或模型). asyncio ...

  4. python异步IO编程(二)

    python异步IO编程(二) 目录 开门见山 Async IO设计模式 事件循环 asyncio 中的其他顶层函数 开门见山 下面我们用两个简单的例子来让你对异步IO有所了解 import asyn ...

  5. Javascript教程:js异步模式编程的4种解决方法

    随着人们对网站视觉效果及用户体验的要求越来越高,所以在未来网站的建设中,设计师们开始越来越多的使用了js文件来达到预期的效果,随着js文件的越来越多,令设计师们最头痛的事情也就来了,那就是Javasc ...

  6. Javascript:自己写异步流程编程框架

    背景 自从NodeJs出来以后,异步编程便更加系统化和框架话了,为了应对异步编程框架带来的深层嵌套问题,社区也出现了异步流程编程框架,本文主要对异步流程框架做一个简单的解析. 现配代码了 var As ...

  7. c# 异步( Async ) 不是多线程

    c# 异步( Async ) 不是多线程   误解 async 在调试 xxxxAsync() 方法的时候,常常会看到调试器界面中会多出一些线程,直觉上误认为 Async 冠名的函数是多线程. 对于 ...

  8. angular之Rxjs异步数据流编程入门

    Rxjs介绍 参考手册:https://www.npmjs.com/package/rxjs 中文手册:https://cn.rx.js.org/ RxJS 是 ReactiveX 编程理念的 Jav ...

  9. Angular RxJs:针对异步数据流编程工具

    一. RxJs:针对异步数据流编程工具 1. 创建subject类对象(发送方) 2. subject.subscribe(观察者); (注册观察者对象observer,可以注册多个相当于回调函数取数 ...

随机推荐

  1. 第二章FISCO BCOS sdk下载和配置是使用

    想了解相关区块链开发,技术提问,请加QQ群:538327407 前提: 1.已经搭建好了一个底层,并且可以正常运行 2.确定外部是否可以连接,如果是云上的服务器,要保证外网可以访问 正式流程 1.下载 ...

  2. C# 如何写 DEBUG 输出

    本文来告诉大家一个规范,如何去写 DEBUG 的输出. 经常在代码中,需要使用 DEBUG 来输出一些奇怪的东西来进行测试.但是输出的窗口只有一个,如果有一个逗比在不停输出,那么就会让输出窗口看不到自 ...

  3. 2018.10.26 浪在ACM 集训队第二次测试赛

    2018.10.26 浪在ACM 集训队第二次测试赛 整理人:苗学林 A海港 参考博客:[1]:李继朋https://www.cnblogs.com/violet-acmer/p/9859006.ht ...

  4. vscode 添加golang插件

    安装好git 下列命令中的路径一定要按照自己实际的路径来 mkdir -p $GOPATH/src/golang.org/x  //路径下创建此文件cd $GOPATH/src/golang.org/ ...

  5. spring boot 多数据源加载原理

    git代码:https://gitee.com/wwj912790488/multiple-data-sources DynamicDataSourceAspect切面 必须定义@Order(-10) ...

  6. python简单小程序

    #足球队寻找10 到12岁的小女孩(包含10岁和12岁),编写程序询问用户性别和年龄,然后显示一条消息指出这个人是否可以加入球队,询问10次,输出满足条件的总人数#询问10次,输出满足要求的总人数 o ...

  7. 一次面试题,将 字符串 保存在 Byte 数组中

    最近在面试,遇到一个面试题 字符串 String str = "AD428C93DE" 编程实现把 str 的内容放到 Byte[6] b 的数组中,存入后并能恢复原来的字符串. ...

  8. sleep()与wait()区别

    1.所在类不一样:sleep在Thread类里面,wait在Object里面. 2.sleep需要抓异常,wait则不用. 3.sleep没有释放锁,wait释放锁. 4.sleep设置了释放时间,w ...

  9. ELK学习实验013:ELK的一个完整的配置操作

    前面做了关于ELK组件的各个实验,但是并没有真正的把各个组件结合起来做一个实验,现在使用一个脚本简单的生成日志,模拟生产不断产生日志的效果 一 流程说明 使用脚本产生日志,模拟用户的操作 日志的格式 ...

  10. mongodb安装及安装MongoDB报错Verify that you have sufficient privileges to start system services解决方法

    1.点击安装包mongodb-win32-x86_64-2012plus-4.2.2-signed进行安装 2.点击next 3.接受协议,点击next 4.点击自定义安装 选择安装路径,建议默认C盘 ...