一、介绍异步的前世今生:

  • 异步编程模型 (APM,Asynchronous Programming Model) 模式(也称 IAsyncResult 模式),在此模式中异步操作需要 Begin 和 End 方法(比如用于异步写入操作的 BeginWrite 和 EndWrite)。 对于新的开发工作不再建议采用此模式
  • 基于事件的异步模式 (EAP,Event-based Asynchronous Pattern),这种模式需要 Async 后缀,也需要一个或多个事件、事件处理程序委托类型和 EventArg 派生类型。 EAP 是在 .NET Framework 2.0 中引入的。 对于新的开发工作不再建议采用此模式。
  • 基于任务的异步模式 (TAP, Task-based Asynchronous Pattern) 使用一种方法来表示异步操作的启动和完成。 TAP 是在 .NET Framework 4 中引入的,并且它是在 .NET Framework 中进行异步编程的推荐使用方法。 C# 中的 async 和 await 关键词以及 Visual Basic 语言中的 Async 和 Await 运算符为 TAP 添加了语言支持。

二、我这里以一个Read方法为例,将异步操作简单进行讲解:

1.普通操作类

public class MyClass
{public int Read(byte [] buffer, int offset, int count);
}

2.异步编程模型(APM)

APM(Asynchronous Programming Model)是.Net 旧版本中广泛使用的异步编程模型。使用了 APM 的异步方法会返回一个 IAsyncResult 对象,这个对象有一个重要的属性 AsyncWaitHandle,他是一个 用来等待异步任务执行结束的一个同步信号。 如果不加 aResult.AsyncWaitHandle.WaitOne() 那么很有可能打印出空白,因为 BeginRead 只是“开始读取”。调用完成一般要调用 EndXXX 来回收资源。  APM 的特点是:方法名字以 BeginXXX 开头,返回类型为 IAsyncResult,调用结束后需要 EndXXX。  .Net 中有如下的常用类支持 APM:Stream、SqlCommand、Socket 等。  APM 还是太复杂,了解即可。

public class MyClass
{public IAsyncResult BeginRead(byte [] buffer, int offset, int count,AsyncCallback callback, object state);public int EndRead(IAsyncResult asyncResult);
}

3.基于事件的异步模式(EAP)

类似于 Ajax 中的 XmlHttpRequest,send 之后并不是处理完成了,而是在 onreadystatechange 事件中再通知处理完成。

优点是简单,缺点是当实现复杂的业务的时候很麻烦,比如下载 A 成功后再下载 b,如果下载 b 成功再下载 c,否则就下载 d。

EAP 的类的特点是:一个异步方法配一个***Completed 事件。.Net 中基于 EAP 的类比较少。也有更 好的替代品,因此了解即可。

public class MyClass
{public void ReadAsync(byte [] buffer, int offset, int count);public event ReadCompletedEventHandler ReadCompleted;
}

4.基于任务的异步模式(TAP)

public class MyClass
{public Task<int> ReadAsync(byte [] buffer, int offset, int count);
}

、我这里以一个下载资料方法为例,将异步操作简单进行讲解:

1.普通同步操作

private void btn_Click(object sender, EventArgs e)//这是同步按钮{using (WebClient wc = new WebClient()){// 我们尝试去下载 python 的安装包。wc.DownloadFile("https://file.aaoit.com/upload/AllLearnFile/admin//2018/4/24/c558f2dc9d6310bfe3cd1788094d3f0c.pdf", "C#课程第一单元学习.pdf");}label1.ForeColor = Color.Blue;label1.Text = "下载完成。";//提示的label}

2.基于事件的异步模式(EAP)

private void btnEAP_Click(object sender, EventArgs e)//这是EAP按钮{using (WebClient wc = new WebClient()){// 我们尝试去下载 python 的安装包。// 下载完成时会有事件通知。wc.DownloadFileCompleted += Wc_DownloadFileCompleted;wc.DownloadFileAsync(new Uri("https://file.aaoit.com/upload/AllLearnFile/admin//2018/4/24/c558f2dc9d6310bfe3cd1788094d3f0c.pdf"), "C#课程第一单元学习EAP.pdf");}}private void Wc_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e){label1.ForeColor = Color.Yellow;label1.Text = "下载完成。";//提示的label}

3.异步编程模型(APM)

private void btnAPM_Click(object sender, EventArgs e)//这是APM按钮{FileStream fs = File.OpenRead("e:/cc.txt"); byte[] buffer = new byte[16]; IAsyncResult aResult = fs.BeginRead(buffer, 0, buffer.Length, null, null); aResult.AsyncWaitHandle.WaitOne();//等待任务执行结束 MessageBox.Show(Encoding.UTF8.GetString(buffer));fs.EndRead(aResult); }

4.基于任务的异步模式(TAP)

private async void btnTAP_Click(object sender, EventArgs e)//这是TAP按钮{using (WebClient wc = new WebClient()){// 我们尝试去下载 python 的安装包。Task task = wc.DownloadFileTaskAsync("https://file.aaoit.com/upload/AllLearnFile/admin//2018/4/24/c558f2dc9d6310bfe3cd1788094d3f0c.pdf", "C#课程第一单元学习TAP.pdf");// 可以在这里执行代码。await task;}label1.ForeColor = Color.Red;label1.Text = "下载完成。";//提示的label}

四、TPL(Task Parallel Library)是.Net 4.0 之后带来的新特性,更简洁,更方便。现在在.Net 平台下已经大面积使用。

TPL即任务并行库,是.NET Framework 4版本中的新鲜物,是System.Threading 和 System.Threading.Tasks 命名空间中的一组公共类型和 API。TPL 的目的在于简化向应用程序中添加并行性和并发性的过程,从而提高开发人员的工作效率。 TPL 会动态地按比例调节并发程度,以便最有效地使用所有可用的处理器。此外,TPL 还处理工作分区、ThreadPool 上的线程调度、取消支持、状态管理以及其他低级别的细节操作。通过使用 TPL,您可以在将精力集中于程序要完成的工作,同时最大程度地提高代码的性能。

1.实现读取txt

private async void btnTPL_Click(object sender, EventArgs e)//这是TPL按钮{FileStream fs = File.OpenRead("e:/cc.txt");byte[] buffer = new byte[16];int len = await fs.ReadAsync(buffer, 0, buffer.Length);MessageBox.Show("读取了" + len + "个字节");MessageBox.Show(Encoding.UTF8.GetString(buffer)); }

注意方法中如果有 await,则方法必须标记为 async,不是所有方法都可以被轻松的标记 为 async。WinForm 中的事件处理方法都可以标记为 async、MVC 中的 Action 方法也可以标 记为 async、控制台的 Main 方法不能标记为 async。  TPL 的特点是:方法都以 XXXAsync 结尾,返回值类型是泛型的 Task<T>。  TPL 让我们可以用线性的方式去编写异步程序,不再需要像 EAP 中那样搞一堆回调、逻 辑跳来跳去了。await 现在已经被 JavaScript 借鉴走了!  用 await 实现“先下载 A,如果下载的内容长度大于 100 则下载 B,否则下载 C”就很容易了 。

2. WebClient 的 TPL 用法: 

private async void btnTPLWebClientNo_Click(object sender, EventArgs e)//这是TPLUI不卡死按钮{WebClient wc = new WebClient();string html = await wc.DownloadStringTaskAsync("https://www.aaoit.com");//不要丢了 await MessageBox.Show(html); }private void btnTPLWebClientYES_Click(object sender, EventArgs e)//这是TPLUI卡死按钮{WebClient wc = new WebClient();var task = wc.DownloadStringTaskAsync("https://www.aaoit.com"); task.Wait(); MessageBox.Show(task.Result); }

WebClient、Stream、Socket 等这些“历史悠久”的类都同时提供了 APM、TPL 风格的 API,甚至有的还提供了 EAP 风格的 API。尽可能使用 TPL 风格的。

【转】1:C#的三种异步的详细介绍及实现相关推荐

  1. Mysql Binlog三种格式详细介绍

    binlog 的不同模式有什么区别呢? 1.Statement:每一条会修改数据的sql都会记录在binlog中. 优点:不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能.(相比 ...

  2. 群星巨型计算机事件,群星 三种特殊事件介绍 特殊事件有几种

    群星 三种特殊事件介绍 特殊事件有几种 相信不少玩家都触发过特殊事件,下面分享玩家带来的三种特殊事件介绍,一起随小编来看看吧. 1,异常类 是指你的科研船在勘探一个星体时发现的,1-4级,需要科研船去 ...

  3. 射频知识基础:三种接收机的介绍

    射频知识基础:三种接收机的介绍 关于接收机结构我们从最传统的超外差结构开始介绍.超外差结构能提供非常好的性能,但这种结构需要大量分离元件,像滤波器等.这种结构无法单芯片集成实现,因此出现了零中频,低中 ...

  4. 40余种刻录盘片详细介绍

    转贴自:http://bbs.zol.com.cn/new/static_book2/17/468/17_217468.shtml 40余种刻录盘片详细介绍 ■刻录盘相关资料 CD-R以及DVD-R的 ...

  5. Hadoop系列 (三):HDFS详细介绍

    文章目录 Hadoop系列文章 HDFS简介 HDFS基本概念 分布式文件系统特点 HDFS设计目标 HDFS架构 HDFS应用场景 HDFS三大组件 NameNode SecondaryNameNo ...

  6. 分布式锁简单入门以及三种实现方式介绍(滴滴)

    很多小伙伴在学习Java的时候,总是感觉Java多线程在实际的业务中很少使用,以至于不会花太多的时间去学习,技术债不断累积!等到了一定程度的时候对于与Java多线程相关的东西就很难理解,今天需要探讨的 ...

  7. STM32三种BOOT模式介绍

    一.三种BOOT模式介绍 所谓启动,一般来说就是指我们下好程序后,重启芯片时,SYSCLK的第4个上升沿,BOOT引脚的值将被锁存.用户可以通过设置BOOT1和BOOT0引脚的状态,来选择在复位后的启 ...

  8. Airplay、DLNA和Miracast三种技术的介绍

    Airplay.DLNA和Miracast三种技术的介绍 AirPlay AirPlay 是苹果开发的一种无线技术,可以通过WiFi将iPhone .iPad.iPod touch 等iOS 设备上的 ...

  9. 分布式锁简单入门以及三种实现方式介绍

    分布式锁简单入门以及三种实现方式介绍 2018年01月11日 21:16:28 徐刘根 阅读数:37912 标签: 分布式 分布式锁 高并发 更多 个人分类: 集群分布式 版权声明:本文为博主原创文章 ...

最新文章

  1. Intellij IDEA运行报Command line is too long解法
  2. git 远程分支和tag标签的操作
  3. python编写一个压测重启的测试程序
  4. java lambda循环_使用Java 8 Lambda简化嵌套循环
  5. LeetCode 59. 螺旋矩阵 II LeetCode 54. 螺旋矩阵
  6. ❤️❤️❤️【资料免费领取】简历模板、职场PPT模板、硬核学习资料+PDF资料(Java、Python、大数据、机器学习)❤️❤️❤️
  7. ajax div iframe,【转】用AJAX模仿IFRAME 在指定DIV打开页面
  8. python数据结构-图
  9. Python的DoS拒绝服务之TCP/SYN洪水攻击
  10. 这五款热门商用密码管理器中均存在缺陷,可导致用户凭证被盗
  11. 王道计算机考研——计算机组成原理笔记
  12. 联通bss转cbss_携号转网山西联通经业务系统受理的首张携入号码开卡成功
  13. C++ 算术平均数及几何平均数
  14. 计算机主板启动加密码,电脑主板BIOS加密解密设置
  15. 6个小众口碑却非常好的APP,收藏起来,变身手机达人!
  16. 19.Eager模式
  17. Codeforces Round #354 (Div. 2)-Theseus and labyrint
  18. 一个计算机爱好者的不完整回忆(四十)做过的一些“外挂”
  19. importerror: libicui18n.so.58: cannot open shared object file: no such file or directory
  20. 电子企业WMS仓储管理系统解决方案

热门文章

  1. 【OS学习笔记】一 处理器、内存和指令
  2. 二、PyCharm 创建Django 第一个项目
  3. 5233杨光--Linux第一次实验
  4. CSS实现不固定宽度和高度的自动居中
  5. mysql command line client闪一下消失
  6. 数据结构与算法总结(完结)
  7. [签名算法]DSA 算法
  8. 亿嘉和机器人上市了吗_亿嘉和上半年收入持续增长,拟7亿元定增加码主业研发...
  9. anaconda中的python如何进行关联分析_Anaconda、Miniconda、Conda、pip的相互关系
  10. 1-2 三位数反转(算法竞赛入门经典)