当前位置:
首页 > Python基础教程 >
-
C#教程之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
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式