c#中异步编程

异步是现实生活中的很多现象的一种抽象。比如分工合作在很多时间段就是异步合作。异步中也一般要涉及委托方法。c#有3种模式的异步编程:异步模式,基于事件的异步模式,基于任务的异步模式(TAP).

一.  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 对象。

 第一种 异步模式 

public class 异步调用
{static void Main(){Console.WriteLine("===== 异步调用 AsyncInvokeTest =====");AddHandler handler = new AddHandler(加法类.Add);//IAsyncResult: 异步操作接口(interface)//BeginInvoke: 委托(delegate)的一个异步方法的开始IAsyncResult result = handler.BeginInvoke(1, 2, null, null);Console.WriteLine("继续做别的事情。。。");//异步操作返回 EndInvoke方式会阻塞主线程 需要等待异步线程调用完毕 才会执行Console.WriteLine(handler.EndInvoke(result));Console.ReadKey();}
}

 

public class 异步回调
{static void Main(){Console.WriteLine("===== 异步回调 AsyncInvokeTest =====");AddHandler handler = new AddHandler(加法类.Add);//异步操作接口(注意BeginInvoke方法的不同!)IAsyncResult result = handler.BeginInvoke(1,2,new AsyncCallback(回调函数),"AsycState:OK");Console.WriteLine("继续做别的事情。。。");Console.ReadKey();}static void 回调函数(IAsyncResult result){     //result 是“加法类.Add()方法”的返回值//AsyncResult 是IAsyncResult接口的一个实现类,空间:System.Runtime.Remoting.Messaging//AsyncDelegate 属性可以强制转换为用户定义的委托的实际类。AddHandler handler = (AddHandler)((AsyncResult)result).AsyncDelegate;//或者 AddHandler handler=result.AsyncState as AddHandler;Console.WriteLine(handler.EndInvoke(result));Console.WriteLine(result.AsyncState);}
}

利用lambda表达式简单写法 (这个很常用。一定要理解和学会。)

            // public delegate string TakesAWhileDelegate(int data1, int data2); 定义一个委托TakesAWhileDelegate dl = (a, b) => { return (a + b).ToString(); }; //委托 实例化dl.BeginInvoke(1, 12, result => {                     //回调方法 实例化string str=dl.EndInvoke(result);                    //EndInvoke方法取回结果Console.WriteLine("取到异步的结果了result={0}", str);}, null);

第二种 基于事件的异步模式

.net中很多类的方法都定义了同步和异步两种模式,例如WebClient类,就定义了DownloadStringAsync基于事件的异步模式。

            WebClient wc = new WebClient();string strUI = "我是主线程中的元素";wc.Encoding = Encoding.UTF8;//首先实例化 Completed事件。 注意:可以直接访问UI线程中的元素// public delegate void DownloadStringCompletedEventHandler(object sender, DownloadStringCompletedEventArgs e);wc.DownloadStringCompleted += (sender1, e1) => {   //e1 存放结果Console.WriteLine(strUI);string str = e1.Result;Console.WriteLine(str);};wc.DownloadStringAsync(new Uri("http://www.baidu.com"));Console.WriteLine("继续主线程,不会因为访问网站而阻塞");

第三种 基于任务的异步模式(Task,await,async关键字)

 

        private void button21_Click(object sender, EventArgs e){Console.WriteLine("主线程已经开始了");CallerWithAsync();  //调用基于任务的异步方法Console.WriteLine("主线程已经结束了");}//创建基于任务的异步方法private async void CallerWithAsync() {//async(方法修饰符)和await必须成对出现。顺序执行string result = await GetAsync("第1个"); //等待 方法执行结果 阻塞线程。编译器把await关键字后的所有代码放进ContinueWith方法的代码块中string result2 = await GetAsync("第2个");Console.WriteLine("任务第3");}//通过任务使同步方法异步化private Task<string> GetAsync(string name){ return Task.Run<string>(() => {Thread.Sleep(2000);Console.WriteLine(name);return name; });}

  

 

 

 

  

 TASK的用法     请参考这篇文章 

异步编程新利器

转载于:https://www.cnblogs.com/crhdyl/p/4892311.html

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

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

相关文章

《交互式程序设计 第2版》一3.6 关系比较

本节书摘来华章计算机《交互式程序设计 第2版》一书中的第3章 &#xff0c;第3.6节&#xff0c;Joshua Noble 著 毛顺兵 张婷婷 陈宇 沈鑫 任灿江 译更多章节内容可以访问云栖社区“华章计算机”公众号查看。 3.6 关系比较 与元组类型类似&#xff0c;关系类型也逃不过“比较运…

mysql 版本更新日志_mysql升级步骤

升级前先请做好数据备份1.解压tar -zxvf mysql-5.7.9-linux-glibc2.5-x86_64.tar.gz2.关闭mysql5.6.23数据库 service mysqld stop3.将5.7.9版本放到默认目录下面mv mysql-5.7.9-linux-glibc2.5-x86_64 /usr/local/mysql4.修改/usr/local/mysql/data 下面的权限chown -R mysql…

C语言中,宏和全局变量的区别是什么?

全局变量 是可以在程序中任何地方使用 而且是可以修改的 宏定义也可以在任何地方使用 但是不能在之后修改 数据类型没有限制的宏的例子&#xff1a;#define 宏名 宏体 #define PI 3.1415926转载自&#xff1a; http://zhidao.baidu.com/link?urlDamb48copKtKBsDeugBDIPT7bk…

android 入门-android自定义控件

第一种&#xff1a;继承View 实现自己的属性 <com.cc.imagewithmarkersample.MyViewandroid:id"id/myviewid"android:layout_width"wrap_content"android:layout_height"wrap_content"android:layout_centerHorizontal"true"SrcLT&…

Undefined symbols for architecture i386:_OBJC_CLASS_$_xx, referenced from: 解决方法

多个人共同操作同一个项目或拷贝项目时&#xff0c;经常会出现类似这样的问题&#xff1a; Undefined symbols for architecture i386: "_OBJC_CLASS_$_xx文件名", referenced from: 下面是可能导致这类问题出现的原因及修改&#xff1a; 1.相关工程文件未导入 你可以…

mysql cmake错误_MySQL5.5安装出现CMake错误找不到CMakelists.txt原因-阿里云开发者社区...

今天虚拟机上测试安装 CentOS6.3 PHP5.4.8 MySQL5.5.28&#xff0c;结果捣鼓了半天 MySQL都没装上&#xff0c;老是CMake目录下找不到那个 lists 文件&#xff0c;郁闷的不行&#xff0c;最后发现问题所在&#xff0c;总结在下面(我是把软件包下载错了)&#xff1a;1. 检查参…

node.js Lordofpomelo点击登录(login)终端提示成功,页面不跳转无反应

firbug查看是因为webserver->public->js->lib->build->build.js文件出错 打开https://raw.githubusercontent.com/NetEase/lordofpomelo/master/web-server/public/js/lib/build/build.js复制替换build.js即可转载于:https://www.cnblogs.com/doujinya/p/396616…

LabVIEW设计模式系列——移位寄存器

标准&#xff1a;1、太多移位寄存器会导致连线太多&#xff0c;看起来凌乱&#xff0c;使用簇将变量打包&#xff0c;统一用一个移位寄存器&#xff0c;这样可以减少连线的麻烦2、如果每个变量都使用一个移位寄存器&#xff0c;没有一个名字是很难区分移位寄存器到底属于哪一个…

CA计划6.14亿美元收购安全测试公司Veracode

CA Technologies 将以6.14亿美元收购应用安全测试公司Veracode&#xff0c;希望以此拓展其开发和测试产品&#xff0c;更好地为企业和应用开发者服务。该收购案预期将于今年第二季度完成。 Veracode的办公地点设在伯灵顿、马萨诸塞和伦敦&#xff0c;是一家雇员超过500人的私营…

MySQL过滤相同binlog_通过Linux命令过滤出binlog中完整的SQL语句

DB&#xff1a;MySQL 5.6.16CentOS&#xff1a;CentOS release 6.3 (Final)当insert语句通过空格跨行输入的时候&#xff0c;如何提取完整的insert语句&#xff01;创建一个空表&#xff1a;mysql> create table yoon as select * from sakila.actor where 10;Query OK, 0 r…

iOS 获取当前月份的天数(转)

在这里我很鄙视百度&#xff0c;尼玛 竟然每一个我想要的结果。。。最后还是用google弄到的。日前又需要自己以后慢慢研究1. 获取当前月份有多少天NSCalendar *calendar [NSCalendarcurrentCalendar]; NSRange range [calendarrangeOfUnit:NSDayCalendarUnitinUnit:NSMonthCa…

Dojo中跨域获取新浪股票接口返回的数据(练习)

首先&#xff0c;配置好环境&#xff0c;不罗嗦了&#xff0c;然后&#xff0c;使用request中的script模块中的方法&#xff0c;获取代码地址为http://hq.sinajs.cn/listsh000001&#xff0c;核心代码如下&#xff1a; 1 on(dom.byId("clickToShowCode")…

Palo Alto Networks全球化安全堡垒理念 提升企业防御能力

IT领域技术发展日新月异&#xff0c;“软件服务”的产品模式成功取代硬件成为人们热议的话题&#xff0c;身处转变中的安全行业也受到了巨大的影响。面对国内外网络安全事件频发&#xff0c;病毒攻击日益复杂、多元化的现状&#xff0c;老牌安全厂商是如何应对的呢? 近日&…

●SQL编程

局部变量局部变量必须以 开头&#xff0c;而且必须先用DECLARE 命令说明后才可使用。使用SELECT 或SET 命令来设定变量的值。说明形式&#xff1a;DECLARE 变量名 变量类型 [ 变量名 变量类型]SELECT 局部变量 变量值SET 局部变量 变量值例&#xff1a;declare name varchar(2…

hdu 1427 速算24点

题目连接 http://acm.hdu.edu.cn/showproblem.php?pid1427 速算24点 Description 速算24点相信绝大多数人都玩过。就是随机给你四张牌&#xff0c;包括A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13)。要求只用,-,*,/运算符以及括号改变运算顺序&#xff0c;使得最终运算结果为2…

《云计算:概念、技术与架构》一1.1 本书目标

本节书摘来华章计算机《云计算&#xff1a;概念、技术与架构》一书中的第1章 &#xff0c;第1.1节&#xff0c;&#xff08;美&#xff09;Thomas Erl   &#xff08;英&#xff09;Zaigham Mahmood 著 &#xff08;巴西&#xff09;Ricardo Puttini 龚奕利 贺 莲 胡 创 …

mysql to char 用法_postgresql 中的to_char()常用操作

postgresql中的to_char()用法和Oracle相比&#xff0c;多了一个参数。to_char(待转换值&#xff0c;转换格式);常用转换格式有2种&#xff1a;一个是写若干个0&#xff0c;如果待转换的值位数少于于你定义的转换格式位数&#xff0c;输出值会自动在左边补0&#xff0c;位数补齐…

面试题40:数组中只出现一次的数字

题目描述 一个整型数组里除了两个数字之外&#xff0c;其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n)&#xff0c;空间复杂度是O(1)。 题目分析 剑指Offer&#xff08;纪念版&#xff09;P211 ① 自己与自己异或为0 ② 0与数A异或为A ③ …

Python3 From Zero——{最初的意识:007~函数}

一、编写可接受任意数量参数的函数&#xff1a;*、** >>> def test(x, *args, y, **kwargs): ... pass ... >>> test(1, 2, 3, 4 ,5 ,5, y9, aa99, bb88,cc900) >>> test(1, 2, 3, 4 ,5 ,5, 9, aa99, bb88,cc900) Traceback (most recent call la…

mysql 数据库名称限制_mysql 数据库名称限制

mysql 数据库名称限制云服务器(Elastic Compute Service&#xff0c;简称ECS)是阿里云提供的性能卓越、稳定可靠、弹性扩展的IaaS(Infrastructure as a Service)级别云计算服务。云服务器ECS免去了您采购IT硬件的前期准备&#xff0c;让您像使用水、电、天然气等公共资源一样便…