.NET异步编程之新利器——Task与Await、Async

一.  FrameWork 4.0之前的线程世界    

    在.NET FrameWork 4.0之前,如果我们使用线程。一般有以下几种方式:

  • 使用System.Threading.Thread 类,调用实例方法Start()开启一个新线程,调用Abort()方法来提前终止线程。
  • 使用System.Threading.ThreadPool类,调用静态方法QueueUserWorkItem(),将方法放入线程池队列,线程池来控制调用。
  • 使用BeginInvoke,EndInvoke,BeginRead,EnRead,BeginWrite,EndWrite等一系列的异步方法。
  • 使用System.ComponentModel.BackgroundWorker控件,调用实例方法RunWorkerAsync(),开启一个新线程。 

二.  .Net 传统异步编程概述 

  • 异步编程模型 (APM),在该模型中异步操作由一对 Begin/End 方法(如 FileStream.BeginRead 和 Stream.EndRead)表示。
  • 基于事件的异步模式 (EAP),在该模式中异步操作由名为“操作名称Async”和“操作名称Completed”的方法/事件对(例如 WebClient.DownloadStringAsync 和 WebClient.DownloadStringCompleted)表示。 (EAP 是在 .NET Framework 2.0 版中引入的,在silverlight或者wpf变成中经常用到)。

三.  Task 的优点以及功能   

  • 在任务启动后,可以随时以任务延续的形式注册回调。
  • 通过使用 ContinueWhenAll 和 ContinueWhenAny 方法或者 WaitAll 方法或 WaitAny 方法,协调多个为了响应 Begin_ 方法而执行的操作。
  • 在同一 Task 对象中封装异步 I/O 绑定和计算绑定操作。
  • 监视 Task 对象的状态。
  • 使用 TaskCompletionSource 将操作的状态封送到 Task 对象。

四.  TASK的用法

     请参考这篇文章

五.  使用 Task 封装常见的异步编程模式

  • 使用Task封装APM异步编程模式。C#5.0中提供的async和await使异步编程更简单。await在msdn的解释是“运算符应用于一个异步方法的任务挂起方法的执行,直到等待任务完成。 任务表示正在进行的工作。”它返回的结果是Task和Task<TResult>.下面我们就用一个demo具体解析:

 
  1. private async void Init()
  2. {
  3. //部分代码省略
  4. var orgs = await _serviceClient.GetAllOrganizationTaskAsync();
  5. }
  6.  
  7. //通过WCF调用,采取分布类,名称一样。
  8. public partial class ServiceClient
  9. {
  10. public Task<ObservableCollection<Organization>> GetAllOrganizationTaskAsync()
  11. {
  12. //Task 封装APM
  13. return Task<ObservableCollection<Organization>>.Factory.FromAsync(this.Channel.BeginGetAllOrganization, this.Channel.EndGetAllOrganization, null);
  14. }
  15. }

  • 使用 Task 对象封装 EPM 异步模式 。 这种模式从 .Net 2.0 开始出现, 同时在 Silverlight 中大量出现, 这种异步模式以 “操作名称Async” 函数和 “操作名称Completed” 事件成对出现为特征。常见的操作有使用lamda表达式;或者使用+=“操作名称Completed”(tip:如果使用lamda表达式,无法回收资源,如果同时调用多个,数据会乱套,建议如果非要用,最好用+=“操作名称Completed”,在操作名称Completed事件中再-=“操作名称Completed”)。
    关键字:TaskCompletionSource,简单理解委托给task属性,利用task来操作。

 
  1. var source = new TaskCompletionSource<string>();
  2.  
  3. var webClient = new WebClient();
  4.  
  5. webClient.DownloadStringCompleted += (sender, args) => {
  6.  
  7. if (args.Cancelled) {
  8.  
  9. source.SetCanceled();
  10.  
  11. return;
  12.  
  13. }
  14.  
  15. if (args.Error != null) {
  16.  
  17. source.SetException(args.Error);
  18.  
  19. return;
  20.  
  21. }
  22.  
  23. source.SetResult(args.Result);
  24.  
  25. };
  26.  
  27. webClient.DownloadStringAsync(new Uri(UrlToTest, UriKind.Absolute), null);
  28.  
  29. source.Task.Wait();
  30.  
  31. var result = source.Task.Result;

此博客来自于http://www.cnblogs.com/luqixinhe/archive/2013/07/18/3197645.html,记录时为了更好的学习。

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

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

相关文章

对比MS Test与NUnit Test框架

前言&#xff1a; 项目中进行Unit Test时&#xff0c;肯定会用到框架&#xff0c;因为这样能够更快捷、方便的进行测试。 .Net环境下的测试框架非常多&#xff0c;在这里只是对MS Test和NUnit Test进行一下比较&#xff0c; 因为这两个框架用的较多&#xff0c;也有大虾想过…

PWN-PRACTICE-BUUCTF-25

PWN-PRACTICE-BUUCTF-25wustctf2020_name_your_catciscn_2019_final_2mrctf2020_shellcode_revengezctf2016_note2wustctf2020_name_your_cat 通过数组越界覆写返回地址为后门shell的地址 from pwn import * #ioprocess(./wustctf2020_name_your_cat) ioremote(node4.buuoj.c…

使用 Github Pages 和 Hexo 搭建自己的独立博客【超级详细的小白教程】

2022-01-25 更新&#xff1a;博客新地址&#xff1a;https://www.itbob.cn/ 欢迎关注我的专栏&#xff1a;《个人博客搭建&#xff1a;HexoGithub Pages》&#xff0c;从搭建到美化一条龙&#xff0c;帮你解决 Hexo 常见问题&#xff01; 推荐阅读&#xff1a;《Hexo 博客优化…

windows程序消息机制(Winform界面更新有关)

1. Windows程序消息机制 Windows GUI程序是基于消息机制的,有个主线程维护着消息泵。这个消息泵让windows程序生生不息。 Windows程序有个消息队列&#xff0c;窗体上的所有消息是这个队列里面消息的最主要来源。这里的While循环使用了GetMessage() 这个方法,这是个阻塞方法,也…

PWN-PRACTICE-BUUCTF-26

PWN-PRACTICE-BUUCTF-26护网杯_2018_gettingstartwustctf2020_number_gamepicoctf_2018_are you rootciscn_2019_en_3护网杯_2018_gettingstart read到buf的时候有溢出&#xff0c;覆写v5为0x7FFFFFFFFFFFFFFF&#xff0c;v6为0x3FB999999999999A from pwn import * ioremote…

最新主流 Markdown 编辑器推荐

Markdown &#xff0c;2004年由 John Gruberis 设计和开发&#xff0c;是一种可以使用普通文本编辑器编写的标记语言&#xff0c;通过简单的标记语法&#xff0c;它可以使普通文本内容具有一定的格式&#xff0c;以下将介绍目前比较流行的一些 Markdown 编辑器&#xff08;排名…

PWN-PRACTICE-BUUCTF-27

PWN-PRACTICE-BUUCTF-27starctf_2019_babyshellpicoctf_2018_buffer overflow 0gyctf_2020_signinbjdctf_2020_YDSneedGrirlfriendstarctf_2019_babyshell 用\x00绕过shellcode检测&#xff0c;call rdx 跳转过去执行汇编代码&#xff0c;一个\x00必执行失败 于是需要找一条机…

Python3 基础学习笔记 C01【变量和简单数据类型】

CSDN 课程推荐&#xff1a;《8小时Python零基础轻松入门》&#xff0c;讲师齐伟&#xff0c;苏州研途教育科技有限公司CTO&#xff0c;苏州大学应用统计专业硕士生指导委员会委员&#xff1b;已出版《跟老齐学Python&#xff1a;轻松入门》《跟老齐学Python&#xff1a;Django实…

Python3 基础学习笔记 C02【列表】

CSDN 课程推荐&#xff1a;《8小时Python零基础轻松入门》&#xff0c;讲师齐伟&#xff0c;苏州研途教育科技有限公司CTO&#xff0c;苏州大学应用统计专业硕士生指导委员会委员&#xff1b;已出版《跟老齐学Python&#xff1a;轻松入门》《跟老齐学Python&#xff1a;Django实…

PWN-PRACTICE-BUUCTF-28

PWN-PRACTICE-BUUCTF-28wustctf2020_name_your_dogjudgement_mna_2016gyctf_2020_some_thing_interestingxman_2019_formatwustctf2020_name_your_dog Partial RELRO&#xff0c;可修改got表 scanf_got距离Dogs56个字节 当index为-7时&#xff0c;即可改写scanf_got为shell的地…

敏捷开发之Scrum扫盲,及敏捷开发中XP与SCRUM的区别

敏捷开发之Scrum扫盲篇 现在敏捷开发是越来越火了&#xff0c;人人都在谈敏捷&#xff0c;人人都在学习Scrum和XP... 为了不落后他人&#xff0c;于是我也开始学习Scrum&#xff0c;今天主要是对我最近阅读的相关资料&#xff0c;根据自己的理解&#xff0c;用自己的话来讲述S…

有关不蒜子访问统计无法显示的解决方法

十月初&#xff0c;不蒜子统计失效了&#xff0c;如下图&#xff1a; 进入不蒜子官网看看&#xff1a; 问题来了&#xff0c;官网写着&#xff1a;因七牛强制过期『dn-lbstatics.qbox.me』域名&#xff0c;与客服沟通无果&#xff0c;只能更换域名到『busuanzi.ibruce.info』…

PWN-PRACTICE-BUUCTF-29

PWN-PRACTICE-BUUCTF-29actf_2019_babyheapwustctf2020_easyfast强网杯2019 拟态 STKOFhitcon_2018_children_tcacheactf_2019_babyheap UAF&#xff0c;创建两个非0x10大小的chunk&#xff0c;比如两个0x20 程序会创建四个chunk&#xff0c;大小依次为0x10&#xff0c;0x20&a…

SCRUM与XP区别

敏捷开发 1、敏捷的含义 敏捷开发是一种以人为核心、迭代、增量的开发方法。在敏捷开发中&#xff0c;把一个大项目分为多个相互联系&#xff0c;可独立运行的小项目&#xff0c;并分别完成&#xff0c;在此过程中软件一直处于可使用状态。 上面提到3个关键词&#xff0c;下…

Python3 基础学习笔记 C03【操作列表】

CSDN 课程推荐&#xff1a;《8小时Python零基础轻松入门》&#xff0c;讲师齐伟&#xff0c;苏州研途教育科技有限公司CTO&#xff0c;苏州大学应用统计专业硕士生指导委员会委员&#xff1b;已出版《跟老齐学Python&#xff1a;轻松入门》《跟老齐学Python&#xff1a;Django实…

PWN-PRACTICE-BUUCTF-30

PWN-PRACTICE-BUUCTF-30suctf_2018_stackwdb_2018_3rd_soEasy[BSidesCF 2019]Runitqctf2018_stack2suctf_2018_stack 栈溢出&#xff0c;ret2text&#xff0c;返回地址不能直接是next_door的起始地址 设置返回地址为0x40067A&#xff0c;开始设置系统调用的参数以及系统调用号…

Java编写程序时出现警告:Resource leak: 'xxx' is never closed 解决方案

菜鸟新手&#xff0c;学校在教Java&#xff0c;作业里面要求我们编程实现运算一个简单的程序&#xff0c;程序写好了&#xff0c;却发现冒出一个警告&#xff0c;如下图&#xff1a; 百度了一下&#xff0c;意思是申明了名为a的数据输入扫描仪&#xff08;Scanner&#xff09…

ASP.Net请求处理机制初步探索之旅 - Part 1 前奏

开篇&#xff1a;ASP.Net是一项动态网页开发技术&#xff0c;在历史发展的长河中WebForm曾一时成为了ASP.Net的代名词&#xff0c;而ASP.Net MVC的出现让这项技术更加唤发朝气。但是&#xff0c;不管是ASP.Net WebForm还是ASP.Net MVC在请求处理机制上大部分都是相同的&#xf…

Python3 基础学习笔记 C04【if 语句】

CSDN 课程推荐&#xff1a;《8小时Python零基础轻松入门》&#xff0c;讲师齐伟&#xff0c;苏州研途教育科技有限公司CTO&#xff0c;苏州大学应用统计专业硕士生指导委员会委员&#xff1b;已出版《跟老齐学Python&#xff1a;轻松入门》《跟老齐学Python&#xff1a;Django实…

ASP.Net请求处理机制初步探索之旅 - Part 2 核心

开篇&#xff1a;上一篇我们了解了一个请求从客户端发出到服务端接收并转到ASP.Net处理入口的过程&#xff0c;这篇我们开始探索ASP.Net的核心处理部分&#xff0c;借助强大的反编译工具&#xff0c;我们会看到几个熟悉又陌生的名词&#xff08;类&#xff09;&#xff1a;Http…