异步编程

1async/await特性结构
异步方法:就是在处理完成之前就返回到调用方法。
async/await特性结构由三个部分构成:
(1)调用方法:调用异步方法的那个方法,它和异步方法可能在相同的线程,也可能在不同的线程。在异步方法执行其任务的时候继续执行。
class Program
{static void Main(){……Task<int> value=DoAsyncStuff.CalculateSumAsync(5,6);……}
}
(2) 异步方法:有异步标识 async
static class DoAsyncStuff
{ public static async Task<int>  CalculateSumAsync(int i1,int i2) ----这就是异步方法 有异步标识 async{int sum=await TaskEx.Run( () => GetSum(i1,i2));return sum;}……
}
(3) await 表达式:异步方法内部,指明需要异步执行的任务。一个异步方法至少包含一个await表达式。
2 什么是异步方法
(1)异步方法
async关键字
至少一个await表达式
返回类型:void  Task  Task<T>
参数不能为out或ref参数
除了方法以外,Lambda表达式和匿名方法也可以作为异步对象。
Task<T>: 如果调用方法要获取一个T类型的值,异步方法的返回类型就必须是Task<T>.调用方法将通过读取Task的Result属性来获取这个T类型的值。这个是有返回参数的返回类型 例如:
Task<int> value=DoStuff.CalculateSumAsync(5,6);
……
Console.WriteLine("Value : {0}",value.Result);
Task: 如果调用方法不需要从异步方法中返回某个值,但需要检查异步方法的状态,那么异步方法可以返回一个Task类型的对象。这时,即使异步方法出现了return语句,也不返回任何东西。例如:
Task  someTask=DoStuff.CalculateSumAsync(5,6);
……
somTask.Wait();
Void:如果调用方法仅仅想执行异步方法,而不需要与它做任何进一步的交互时[这成为[fire and forget]。这时,与上面一样,即使方法中包含return语句也不会返回任何东西。Demo:使用返回Task<int> 对象的异步方法classProgram{staticvoid Main(string[] args){Task<int> value=DoAsyncStuff.CalculateSumAsync(5,6);Console.WriteLine("Value:{0}", value.Result);}}static async Task<int> CalculateSumAsync(int i1, int i2){int sum = awaitTask.Run(() => GetSum(i1, i2));return sum;} privatestaticint GetSum(int i1, int i2){return i1 + i2;}
Demo:使用返回Task对象的异步方法classProgram{staticvoid Main(string[] args){Task someTask = DoAsyncStuff.CalculateSumAsync1(5, 6);//处理其他事情
            someTask.Wait();Console.WriteLine("Async stuff is done");Console.ReadLine();}}  
publicstaticasyncTask CalculateSumAsync1(int i1, int i2){int sum = awaitTask.Run(() => GetSum(i1, i2));Console.WriteLine("Value:{0}", sum);}privatestaticint GetSum(int i1, int i2){ return i1 + i2;}
Demo:使用返回void的异步方法staticvoid Main(string[] args){DoAsyncStuff.CalculateSumAsync2(5, 6);//处理其他事情Thread.Sleep(200);----如果这里不暂停当前线程,则会先输出Program Exiting,在输出11Console.WriteLine("Program Exiting");}publicstaticasyncvoid CalculateSumAsync2(int i1, int i2){int sum = awaitTask.Run(() => GetSum(i1, i2));Console.WriteLine("Value:{0}", sum);} privatestaticint GetSum(int i1, int i2){return i1 + i2; }当程序运行到异步方法内部的await表达式时,异步方法会立即创建一个返回类型Task或Task<T>的对象,并返回给调用方法。
调用方法使用Task对象,取其Result属性时,如果异步方法还没有设置该属性,调用方法就暂停等待。(2)异步方法控制流:privateasyncTask<int> CountCharactersAsync(string uriString){WebClient wc = newWebClient();string result = await wc.DownloadStringTaskAsync(uriString);return result.Length;}
上面的异步方法,在遇到await时会立即返回,返回的这个类型与await表达式本身的内容没有关系,会创建一个异步方法返回类型的对象,即Task<int>对象。而异步方法的return语句并没有真正返回某个值,只是退出了。
(3)await表达式
.net 4.5,有大量的异步方法在BCL中。比如上面的DownloadStringTaskAsync方法等。
也可以自己编写异步方法:
使用Task.Run()方法,这个方法是在不同的线程上运行你的方法。
Task.Run的签名:Task Run(Func<TReturn> func)
因此定义异步方法,最重要的就是要创建一个委托。
Demo:使用Task.Run定义await表达式,进而定义异步方法。classMyClass{publicint Get10(){ return 10; }publicasyncTask DoWorkAsync(){Func<int> ten = newFunc<int>(Get10);int a = awaitTask.Run(ten);int b = awaitTask.Run(newFunc<int>(Get10));int c = awaitTask.Run(() => { return 10; });//该Lambda表达式是与Func<int>兼容的将隐式转换为该委托Console.WriteLine("{0}  {1} {2}", a, b, c);}}staticvoid Main(string[] args){Task t = (newMyClass()).DoWorkAsync();Console.WriteLine("111");t.Wait();Console.WriteLine("222");}
结果:Task.Run:

4)取消一个异步操作(5)异常处理与await表达式 Task t t.Satus t.IsFaulted (6)在调用方法中同步的等待任务 wait() t.Wait(); Task.WaitAll(); Task.WaitAny();(7)在异步方法中异步的等待任务异步等待所有tasks中的任务完成,不会占用主线程的时间。

 

转载于:https://www.cnblogs.com/rwh871212/p/6963370.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/429227.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

预算里怎样计算机械作业费,用实物法编制施工图预算的完整步骤有( )等。 A.计算工程量B.套用预算人工、材料、机械 - 作业在线问答...

相关题目与解析用实物法编制施工图预算的完整步骤有()等。A&#xff0e;计算工程量B&#xff0e;套用预算人工、材料、机械台用实物法编制施工图预算时&#xff0c;分项工程量计算之后的步骤是()。A&#xff0e;套用预算定额单价B&#xff0e;实物量法编制施工图预算的步骤包括…

第二次冲刺07

昨天&#xff1a;解决当教学楼名字过长时&#xff0c;后边的图片无法正常显示的问题。 今天&#xff1a;重新设计数据库&#xff0c;将1-2节课合并&#xff0c;这两门课的使用状态是相同的&#xff0c;所以显示的时候只显示6张图片就行。 遇到的问题&#xff1a;将从服务器获得…

计算机中函数counta表示,excel中counta函数的使用方法

你还在为Excel中counta函数的使用方法而苦恼吗&#xff0c;今天小编教你Excel中counta函数的使用方法&#xff0c;今天&#xff0c;学习啦小编就教大家在counta函数的使用方法。Excel的counta函数的使用方法如下&#xff1a;主要从四方面对Excel函数进行讲解&#xff0c;1.函数…

天正计算机命令大全,天正CAD 中按Ctrl+v在不同图中粘贴出现“未知命令T81_tpasteclip”,直接在CAD中就能操作...

天正CAD 中按Ctrlv在不同图中粘贴出现“未知命令T81_tpasteclip”&#xff0c;直接在CAD中就能操作以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;天正CAD 中按Ctrlv在不同图中粘贴出现“未…

linux系统转换root权限

有时候我们用普通用户的权限没办法完成有关权限&#xff0c;这时候我们就需要拿到root权限才可以&#xff0c;拿到root权限有两种方式 方式一&#xff1a; su - 或者su 此时就会提示你输入密码&#xff0c;输入密码成功以后就能以root权限操作&#xff0c;变成root以后会从$变成…

3级软件测试试题,软件测试人员(.NET)_3级_操作技能鉴定1.1.3试题单(26页)-原创力文档...

我想忘记你&#xff0c;可做不到……?其实你并不是 完美得无可替代&#xff0c;?你永远是不懂我的心思?不知道我为什么会因为一件小事?就能 开心一整天?也不知道我为什么会因为一句话?而 难过好多天?不懂我的任性?我的乱发脾气?我的恨从哪里来&#xff1f;?为什么我总…

挺好用的Markdown写法

最近喜欢用有道云写东西&#xff0c;挺爽的&#xff0c;同时也支持markdown写法&#xff0c;大家可以去试试 最近markdown很火&#xff0c;因为写文档之类很简洁很漂亮好排版&#xff0c;可以了解一下 例如github上就用这个&#xff0c; 例如这个就是用markdown写出来的介绍&am…

软件测试qa等级考核制度,QA质量规范

Keywords: 提高准入标准、增加冒烟测试、增加各节点质量效率(进度)评估BUG质量规范BUG录入标准BUG 优质级别从测试评估维度出发BUG 严重程度从开发评估维度出发1.统一BUG标题格式&#xff1a;(为BUG分析做准备)新需求BUG&#xff1a;【需求名(版本号)】(【性能/兼容/安全】)模块…

上周热点回顾(6.5-6.11)

热点随笔&#xff1a; 是时候开始用C#快速开发移动应用了&#xff08;腾飞&#xff08;Jesse)&#xff09; C#码农的大数据之路 - 使用C#编写MR作业&#xff08;hystar&#xff09; 人人网面试经历&#xff08;少年张翠山&#xff09; 数据库表设计&#xff0c;没有最好只有最…

16位计算机cpu电路图,简单16位CPU设计.doc

简单16位CPU设计简单16位CPU设计一、实验内容完成从指令系统到CPU的设计&#xff0c;编写测试程序&#xff0c;通过运行测试程序对CPU设计进行正确性评定。具体内容包括&#xff1a;典型指令系统(包括运算类、转移类、访存类)设计&#xff1b;CPU结构设计&#xff1b;CPU的VHDL…

ffmpeg在android上输出滑屏问题处理

ffmpeg部分机器上有花屏的问题 原代码例如以下: while(av_read_frame(formatCtx, &packet)>0 && !_stop && NULL!window && bInit) {// Is this a packet from the video stream?if(packet.stream_indexvideoStream) {// Decode video frameav…

服务器iis自动停止,IIS应用程序池老是自动停止

老是出现这样的情况&#xff0c;相当郁闷&#xff0c; 一天都能死好几次。错误报告如下&#xff1a;为应用程序池“XXXX”提供服务的进程意外终止。进程 ID 是“1920”。进程退出代码是“0xff”。RDP 协议组件 X.224 在协议流中发现一个错误并且中断了客户端连接。策略禁用了其…

loadrunner学习理论之一

1、负载测试与压力测试的区别&#xff1f; 答&#xff1a;负载测试是在系统承受正常范围下进行的测试&#xff0c;压力测试有可能在非正常范围下进行测试&#xff0c;相同点&#xff1a;负载测试与压力测试都是逐步加压的 2、LoadRunner的三大组件以及中英文对照&#xff1f; 答…

ff14拆区后哪个服务器人最多,FF14拆区可以转服吗 拆区期间转服教程

FF14拆区可以转服吗?随着FF14拆区改动的来临&#xff0c;很多玩家开始迷惘&#xff0c;毕竟自从开了跨服以后&#xff0c;跟同区不同服的亲友一起游戏的机会大大增加了。现在随着拆区改动&#xff0c;不少玩家还不知道能不能继续跟亲友玩耍&#xff0c;想知道拆区可以转服吗&a…

基于 vue2 导航栏透明渐变

在移动或者app 中经常会用&#xff0c;顶部导航栏固定&#xff0c;但是随着页面向上滚动&#xff0c;导航栏的透明度发生变化。 做法为&#xff1a; 1、首先给要滚动变化的导航添加 :style"style" <mt-header fixed title"个人中心" :style"style…

mvc怎么单独引用css文件,关于asp.net mvc:如何在剃刀视图中引用.css文件?

我知道如何在layout.cshtml文件上设置.css文件&#xff0c;但是在每个视图的基础上应用样式表呢&#xff1f;我在这里的想法是&#xff0c;在layout.cshtml中&#xff0c;您可以使用标记&#xff0c;但在非布局视图中不能这样做。标签在哪里&#xff1f;对于在整个站点中重用的…

索引快速查询

一、索引 索引是表的目录&#xff0c;在查找内容之前可以先在目录中查找索引位置&#xff0c;以此快速定位查询数据。对于索引&#xff0c;会保存在额外的文件中。 名词&#xff1a; 覆盖索引&#xff1a; - 在索引文件中直接获取数据 索引合并&#xff1a; …

css中设置图片旋转45度,css 实现缓和变量,鼠标悬停时元素旋转45度动画

可重复使用的变数transition-timing-function 属性&#xff0c;比内置更强大ease &#xff0c;ease-in &#xff0c;ease-out 和ease-in-out 。HTMLCSS:root {--ease-in-quad: cubic-bezier(0.55, 0.085, 0.68, 0.53);--ease-in-cubic: cubic-bezier(0.55, 0.055, 0.675, 0.19)…

数理逻辑量词的引入

尽管数学科普是我的心愿&#xff0c;可是科普数学确实存在一定的实际困难。为什么呢&#xff1f; 科普数学须要一套公认的数学语言&#xff0c;也就是说&#xff0c;使用一套符号体系表达意思。可是&#xff0c;数学符号不是一般人生来就懂得的。并且比較难于记忆。比方&#x…

服务器红帽操作系统安装,怎么安装red hat操作系统

红帽在2014年6月发布了最新旗舰版企业操作系统——红帽企业Linux 7。基于红帽企业Linux 7操作系统&#xff0c;企业可整合裸机服务器、 虚拟机、基础设施即服务(IaaS)和平台即服务(PaaS)&#xff0c;以构建一个强大稳健的数据中心环境&#xff0c;满足不断变化的业务需求。学习…