.NET三种异步模式(APM、EAP、TAP)

APM模式:

.net 1.0时期就提出的一种异步模式,并且基于IAsyncResult接口实现BeginXXX和EndXXX类似的方法。

.net中有很多类实现了该模式(比如HttpWebRequest),同时我们也可以自定义类来实现APM模式(继承IAsyncResult接口并且实现BeginXXX和EndXXX方法)

 1 /// <summary>2         /// 异步3         /// </summary>4         /// <param name="sender"></param>5         /// <param name="e"></param>6         private void button2_Click(object sender, EventArgs e)7         {8             //先清空上一次查询结果9             this.richTextBox1.Text = "";
10 
11             var url = this.textBox1.Text.Trim();
12             var request = HttpWebRequest.Create(url);
13             request.BeginGetResponse(AsyncCallbackImpl, request);//BeginGetResponse,发起异步请求
14         }
15 
16         /// <summary>
17         /// 回调
18         /// </summary>
19         /// <param name="ar"></param>
20         public void AsyncCallbackImpl(IAsyncResult ar)
21         {
22             HttpWebRequest request = ar.AsyncState as HttpWebRequest;
23             var response = request.EndGetResponse(ar);//EndGetResponse,异步请求完成
24             var stream = response.GetResponseStream();
25             StringBuilder sb = new StringBuilder();
26             sb.AppendLine("当前线程Id:" + Thread.CurrentThread.ManagedThreadId);
27             using (StreamReader reader = new StreamReader(stream))
28             {
29                 var content = reader.ReadLine();
30                 sb.AppendLine(content);
31                 this.richTextBox1.Text = sb.ToString();
32             }
33         }
34   
1 Func<int, int> func = (i) => i + 1;
2             func.BeginInvoke(5, (asyncResult) => {
3                 //Console.WriteLine("call back,param:"+result.AsyncState);
4                 int result = func.EndInvoke(asyncResult);
5                 Console.WriteLine("result:"+ result); 
6             }, null);

EAP模式:

基于事件的异步模式是.net 2.0提出的,实现了基于事件的异步模式的类将具有一个或者多个以Async为后缀的方法和对应的Completed事件,并且这些类都支持异步方法的取消、进度报告和报告结果。然而.net中并不是所有的类都支持EAP。

当调用基于事件的EAP模式的类的XXXAsync方法时,就开始了一个异步操作,并且基于事件的EAP模式是基于APM模式之上的,而APM又是建立在委托之上的。下面的Demo就以BackgroundWorker类来演示如何使用EAP异步。

 1 BackgroundWorker worker = new BackgroundWorker();2             worker.DoWork += Worker_DoWork;3             worker.RunWorkerCompleted += Worker_RunWorkerCompleted;4             worker.RunWorkerAsync(null);5 6         private static void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)7         {8             Console.WriteLine("dowork completed");9         }
10 
11         private static void Worker_DoWork(object sender, DoWorkEventArgs e)
12         {
13             Console.WriteLine("dowork");
14         }

TAP模式:

.net 4.0为我们带来了Task的异步,我们有以下三种方法创建Task。

1,Task.Factory.StartNew,比较常用。

2,Task t1 = new Task(() => { Console.WriteLine("t1 start"); });    t1.Start();

3,Task.Run,是.net 4.5中增加的。

4,Task.FromResult,如果结果是已计算,就可以使用这种方法来创建任务。

 

 1 /// <summary>2         /// 使用async/await3         /// </summary>4         /// <param name="sender"></param>5         /// <param name="e"></param>6         private async void button5_Click(object sender, EventArgs e)7         {8             this.richTextBox1.Text = "正在处理请求...";9 
10             await DoWorkAsync();
11         }
12 
13         public async Task DoWorkAsync()
14         {
15             var url = this.textBox1.Text.Trim();
16             var request = HttpWebRequest.Create(url);
17             var response = request.GetResponse();
18             var stream = response.GetResponseStream();
19             using (StreamReader reader = new StreamReader(stream))
20             {
21                 var content = reader.ReadToEnd();
22                 this.richTextBox1.Text = content;
23             }
24         }
25   
26   View Code

 

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

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

相关文章

Nacos 使用

环境准备 64 bit OS&#xff0c;支持 Linux/Unix/Mac/Windows&#xff0c;推荐选用 Linux/Unix/Mac。64 bit JDK 1.8&#xff1b;下载 & 配置。Maven 3.2.x&#xff1b;下载 & 配置。 下载 Nacos 并启动 Nacos server。 启动配置管理 启动了 Nacos server 后&#x…

四种并发编程模型简介

概述 并发往往和并行一起被提及&#xff0c;但是我们应该明确的是“并发”不等同于“并行” • 并发 &#xff1a;同一时间 对待 多件事情 &#xff08;逻辑层面&#xff09; • 并行 &#xff1a;同一时间 做(执行) 多件事情 (物理层面) 并发可以构造出一种问题解…

easyexcel操作Excel导入导出

需要添加maven依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.0.5</version></dependency> 读Excel package com.alibaba.easyexcel.test.demo.read;import java.io.File; …

从编译到执行,C++如何开发SIMD友好的代码?

一&#xff1a;名词解释 Flynn分类法 Flynn于1972年提出了计算平台的Flynn分类法,主要根据指令流和数据流来分类。按照Flynn分类法&#xff0c;计算平台共分为四种类型。 1.单指令流单数据流机器(SISD) 2.单指令流多数据流机器(SIMD) 3.多指令流单数据流机器(MISD) 4.多指令流…

Nacos介绍

Nacos 英文全称为 Dynamic Naming and Configuration Service&#xff0c;是一个由阿里巴巴团队使用 Java 语言开发的开源项目。 参考:home (nacos.io) Nacos 是一个更易于帮助构建云原生应用的动态服务发现、配置和服务管理平台&#xff0c;可以将 Nacos 理解成服务注册中心…

在部署 C#项目时转换 App.config 配置文件

问题 部署项目时&#xff0c;常常需要根据不同的环境使用不同的配置文件。例如&#xff0c;在部署网站时可能希望禁用调试选项&#xff0c;并更改连接字符串以使其指向不同的数据库。在创建 Web 项目时&#xff0c;Visual Studio 自动生成了 Web.config、Web.Debug.config、We…

@Transactional

事务场景中&#xff0c;抛出异常被catch后&#xff0c;如果需要回滚&#xff0c;一定要手动回滚事务。 Spring事务框架默认只在抛出RuntimeException和unchecked exceptions时才将事务回滚&#xff08;Errors默认 - 事务回滚&#xff09;&#xff0c;但是抛出的Checked except…

设计模式之Factory

设计模式之Factory 2016-08-04 11:57 设计模式总共有23种模式这种都仅仅是为了一个目的&#xff1a;解耦解耦解耦...&#xff08;高内聚低耦合满足开闭原则&#xff09; 介绍: Factory Pattern有3种当然是全部是creational pattern。 1.Simple Factory Pattern 2.Factory…

centos 7 中没有iptables 和service iptables save 指令使用失败问题解决方案

1.任意运行一条iptables防火墙规则配置命令&#xff1a; iptables -P OUTPUT ACCEPT 2.对iptables服务进行保存&#xff1a; service iptables save 如果上述命令执行失败报出&#xff1a;The service command supports only basic LSB actions (start, stop, restart,…

linux防火墙查看及白名单配置

1、基本操作 1、开启防火墙 systemctl start firewalld 2、关闭防火墙 systemctl stop firewalld ​3、重启防火墙 firewall-cmd --reload ​ #Linux防火墙--iptables--白名单配置 端口开通给指定IP iptables -I INPUT -s 10.1.1.1 -p tcp -m tcp --dport 80 -j ACCEPT #查看…

C#多线程之旅(七)——终止线程

阅读目录 一、什么时候用Thread.Abort();二、Thread.Abort的用法三、无法终止线程的情形四、Catch块中抛出异常五、Finally块中抛出异常六、Abort调用的时间先交代下背景&#xff0c;写《C#多线程之旅》这个系列文章主要是因为以下几个原因&#xff1a;1.多线程在C/S和B/S架构中…

ASP.NET MVC 入门7、Hellper与数据的提交与绑定

本系列文章基于ASP.NET MVC Preview5. ASP.NET MVC提供了很多Hellper的方法&#xff0c;Hellper就是一些生成HTML代码的方法&#xff0c;方便我们书写HTML代码(有一部分的朋友更喜欢直接写HTML代码)。我们也可以利用.NET 3.5的扩展方法来书写我们自己的Hellper。 例如&#x…

ASP.NET MVC 入门8、ModelState与数据验证

ViewData有一个ModelState的属性&#xff0c;这是一个类型为ModelStateDictionary的ModelState类型的字典集合。在进行数据验证的时候这个属性是比较有用的。在使用Html.ValidationMessage()的时候&#xff0c;就是从ViewData.ModelState中检测是否有指定的KEY&#xff0c;如果…

ASP.NET MVC 入门9、Action Filter 与 内置的Filter实现(介绍)

本系列文章基于ASP.NET MVC Preview5. 有时候你想在调用action方法之前或者action方法之后处理一些逻辑&#xff0c;为了支持这个&#xff0c;ASP.NET MVC允许你创建action过滤器。Action过滤器是自定义的Attributes&#xff0c;用来标记添加Action方法之前或者Action方法之后…

ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)

本系列文章基于ASP.NET MVC Preview5. 前一篇中我们已经了解了Action Filter 与 内置的Filter实现&#xff0c;现在我们就来写一个实例。就写一个防盗链的Filter吧。 首先继承自FilterAttribute类同时实现IActionFilter接口&#xff0c;代码如下&#xff1a; /// <summary…

.netcore持续集成测试篇之MVC层单元测试

前面我们讲的很多单元测试的的方法和技巧不论是在.net core和.net framework里面都是通用的,但是mvc项目里有一种比较特殊的类是Controller,首先Controller类的返回结果跟普通的类并不一样,普通的类返回的都是确定的类型,而mvc项目的返回的ActionResult或者core mvc里返回的IAc…

SqlServer学习之触发器

什么是触发器&#xff1f; 根据百度百科的解释&#xff0c;触发器是SqlServer提供给程序员和数据分析员来保证数据完整性的一种方法&#xff0c;它是与表事件相关的特殊的存储过程&#xff0c;他的执行不是有程序调用&#xff0c;也不是手工启动&#xff0c;而是由事件来出发&a…

base64原理及其编解码的python实现

base64原理及其编解码的python实现base64base64简介base64编码表base64编码原理base64编解码的python实现其他base编码base16base32base36、base58、 base62、 base85、base91、 base92base64 base64简介 base64是一种基于64个可打印字符来表示二进制数据的表示方法。2664&am…

Microsoft Visual Studio 文件识别及其用途简述

VS2008 新建项目后会产生相应的文件sln、ncb、suo、以及相应项目工程文件夹&#xff0c;项目工程文件夹下包括vcproj、filters、ReadMe.txt、targetver.h、stdafx.h、stdafx.cpp及其他文件&#xff1b;VS2010/VS2010/VS2012/VS2013 新建项目后会产生文件sln、suo、sdf、ipch文件…

REVERSE-PRACTICE-JarvisOJ-1

REVERSE-PRACTICE-JarvisOJ-1[61dctf]androideasy[61dctf]stheasyDD - Android NormalDD - Android Easy[61dctf]androideasy apk文件&#xff0c;用jadx-gui打开 主要的逻辑为&#xff0c;获取输入&#xff0c;检验输入的长度&#xff0c;输入异或23后与已知数组比较&#xf…