C#中委托实现的异步编程
所谓同步:如果在代码中调用了一个方法,则必须等待该方法所有的代码执行完毕之后,才能回到原来的地方执行下一行代码。
异步:如果不等待调用的方法执行完,就执行下一行代码。
1.0 同步例子:
class Program
{
private static int Calculate(int a, int b)
{
Console.WriteLine("1.开始计算!"); System.Threading.Thread.Sleep( * );//假如计算需要3秒钟 int c = a + b; Console.WriteLine("2.计算完成,结果:{0}+{1}={2}", a, b, c); return c;
} static void Main(string[] args)
{
Console.WriteLine("---------程序运行开始----------"); Calculate(, ); Console.WriteLine("---------程序运行结束----------"); Console.ReadKey();
}
}
1.1 运行结果:

2.0 改用异步调用
static void Main(string[] args)
{
Console.WriteLine("-----------程序运行开始----------"); Func<int, int, int> action = Calculate;//声明一个委托 IAsyncResult ret = action.BeginInvoke(, , null, null); Console.WriteLine("1.我不参与计算,先走了啊!"); int amount = action.EndInvoke(ret); Console.WriteLine("-----------程序运行结束----------"); Console.ReadKey();
}
2.1 运行结果:

2.2 为了提高程序的使用体验,我们可以再计算的时候,每隔一秒钟,打印一个点“.”。整体代码改成如下:
private static int Calculate(int a, int b)
{
System.Threading.Thread.Sleep( * );//假如计算需要3秒钟 int c = a + b; Console.WriteLine("\r\n计算完成,结果:{0}+{1}={2}", a, b, c); return c;
} static void Main(string[] args)
{
Console.WriteLine("-----------程序运行开始----------"); Func<int, int, int> action = Calculate;//声明一个委托 IAsyncResult ret = action.BeginInvoke(, , null, null); Console.WriteLine("我不参与计算,先走了啊!"); Console.WriteLine("正在努力计算:");
while (ret.IsCompleted == false)
{
Console.Write(".");
System.Threading.Thread.Sleep();
} int amount = action.EndInvoke(ret); Console.WriteLine("-----------程序运行结束----------"); Console.ReadKey();
}
2.3 运行结果:

3.0 异步回调。以上方式还没有体现异步编程的效果,因为整个计算过程都是在“程序运行开始”和”程序运行结束“之间的。所以还有另外一种实现方式,整体代码改成如下:
private static int Calculate(int a, int b)
{
System.Threading.Thread.Sleep( * );//假如计算需要3秒钟 int c = a + b; return c;
} static Func<int, int, int> func = Calculate;//声明一个委托 static void Main(string[] args)
{
Console.WriteLine("-----------程序运行开始----------"); IAsyncResult ret = func.BeginInvoke(, , ShowFolderSize,""); Console.WriteLine("计算开始:"); Console.WriteLine("-----------程序运行结束----------"); Console.ReadKey();
} public static void ShowFolderSize(IAsyncResult result)
{
int c = func.EndInvoke(result);
Console.WriteLine("计算完成,结果为:{0}",c);
}
3.1 运行结果:

3.2 注意回调方法的返回值类型是void,只能有一个IAsyncResult类型的参数,并且要在方法体中调用EndInvoke来取回方法执行的结果,另外result参数的AsyncState属性包含了外界传入的参数信息。
C#中委托实现的异步编程的更多相关文章
- 使用C#委托来实现异步编程
最近在我参与的几个.Net项目中都有用到异步编程,作为一名.Net小白,很有必要好好地学习一下异步编程. 什么是异步编程 异步编程指的就是不用阻塞当前线程来等待任务的完成,而是将任务扔到线程池中去执行 ...
- .NET 中的 async/await 异步编程
原文出处: Teroy 的博客 前言 最近在学习Web Api框架的时候接触到了async/await,这个特性是.NET 4.5引入的,由于之前对于异步编程不是很了解,所以花费了一些时间学习一下相关 ...
- 在Python中使用asyncio进行异步编程
对于来自JavaScript编码者来说,异步编程不是什么新东西,但对于Python开发者来说,async函数和future(类似JS的promise)可不是那么容易能理解的. Concurrency ...
- ASP.Net中的async+await异步编程
在.NET Framework4.5框架.C#5.0语法中,通过async和await两个关键字,引入了一种新的基于任务的异步编程模型(TAP).在这种方式下,可以通过类似同步方式编写异步代码,极大简 ...
- 基于委托的C#异步编程的一个小例子 带有回调函数的例子
我创建的是一个winform测试项目:界面如下: 设置: 下面是代码: using System; using System.Collections.Generic; using System.Com ...
- 全面解析C#中的异步编程
当我们处理一些长线的调用时,经常会导致界面停止响应或者IIS线程占用过多等问题,这个时候我们需要更多的是用异步编程来修正这些问题,但是通常都是说起来容易做起来难,诚然异步编程相对于同步编程来说,它是一 ...
- 深入理解nodejs中的异步编程
目录 简介 同步异步和阻塞非阻塞 javascript中的回调 回调函数的错误处理 回调地狱 ES6中的Promise 什么是Promise Promise的特点 Promise的优点 Promise ...
- C# 异步编程1 APM模式异步程序开发
C#已有10多年历史,单从微软2年一版的更新进度来看活力异常旺盛,C#中的异步编程也经历了多个版本的演化,从今天起着手写一个系列博文,记录一下C#中的异步编程的发展历程.广告一下:喜欢我文章的朋友,请 ...
- C# 异步编程1 APM 异步程序开发
C#已有10多年历史,单从微软2年一版的更新进度来看活力异常旺盛,C#中的异步编程也经历了多个版本的演化,从今天起着手写一个系列博文,记录一下C#中的异步编程的发展历程.广告一下:喜欢我文章的朋友,请 ...
随机推荐
- CKFinder_AspDotNet_2.4 破解方法 去版权
CKFinder是一个比较好用的Web端文件管理器,虽然UI不是很好看,但是因为能搞到源码,所以比起网上那些只有付费之后才能下载到源码的Web端文件管理器要好许多,至少你可以在确定该控件是否能用在你的 ...
- 如何制作自己的yum源
在 /etc/yum.repos.d下创建一个以.repo结尾的文件如aaa.repo,其内容如下(一定要以repo结尾) [aaa] name=aaa baseurl=http://mirror ...
- MySQL(五) MySQL中的索引详讲
序言 之前写到MySQL对表的增删改查(查询最为重要)后,就感觉MySQL就差不多学完了,没有想继续学下去的心态了,原因可能是由于别人的影响,觉得对于MySQL来说,知道了一些复杂的查询,就够了,但是 ...
- Java连接MongoDB进行增删改查
1.导入必须的包: 详情看项目:http://pan.baidu.com/s/1cvDAOY 2.通过Myeclipse创建WEB项目 3. 3.bean:创建实体类 package com.bean ...
- 邻接表有向图(二)之 C++详解
本章是通过C++实现邻接表有向图. 目录 1. 邻接表有向图的介绍 2. 邻接表有向图的代码说明 3. 邻接表有向图的完整源码 转载请注明出处:http://www.cnblogs.com/skywa ...
- Deep learning:四十八(Contractive AutoEncoder简单理解)
Contractive autoencoder是autoencoder的一个变种,其实就是在autoencoder上加入了一个规则项,它简称CAE(对应中文翻译为?).通常情况下,对权值进行惩罚后的a ...
- Tridiv:基于 Web 的 CSS 编辑器,创建炫丽 3D 图形
Tridiv 是一个基于 Web 的编辑器,使用 CSS 创建 3D 形状.它提供了一个传统的四个面板的操作界面,给出了从每个平面的视图,以及一个预览窗格中示出的最终的效果.使用 Tridiv 可以创 ...
- 分享一个Jquery 分页插件 Jquery Pagination
分页插件来说,我觉得适用就行,尽量简单然后能够根据不同的应用场景能够换肤.展现形式等. 对于初学者想写分页插件的同学,也可以看下源码,代码也挺简单明了的,也助于自己写个小插件. 不过我比较懒,一般直接 ...
- 详解css中的position属性
这一次直接进入主题. css中最常用的布局类属性,一个是float,另一个就是定位属性position. 对于position来讲,有以下属性值: static : 无特殊定位,对象处于正常文档流.其 ...
- Entity Framework 实体框架的形成之旅--数据传输模型DTO和实体模型Entity的分离与联合
在使用Entity Framework 实体框架的时候,我们大多数时候操作的都是实体模型Entity,这个和数据库操作上下文结合,可以利用LINQ等各种方便手段,实现起来非常方便,一切看起来很美好.但 ...