C#基础:线程之异步回调(委托)
异步回调,什么是异步回调?我是这样理解的,当主线程在执行一段代码的时候,我们用委托执行了一个线程,这个线程要返回一个结果,关键是什么时候返回这个结果,异步回调就是在这个线程执行完成后立即返回这个线程的结果,然后继续执行主线程的方法。
在讨论异步回调之前我们先依次来讨论一下同步执行和异步执行,最后来讨论异步回调。
一、同步执行
同步执行:在主线程执行的时候,主线程调用一个其它方法,此时主线程阻塞,等待调用方法执行完成后主线程才能继续执行。
下面是同步执行的流程图

接下来看看代码中的同步执行

static void Main(string[] args)
{
#region 同步执行
for (int i = 0; i < 100; i++)
{
if (i == 50)
{
Console.Write("调用方法TakeAWhile并等待方法执行完成。");
TakeAWhile(1, 3000);
Console.Write("方法TakeAWhile执行完成。。。");
}
Thread.Sleep(30);
Console.Write(".");
}
#endregion
}
static int TakeAWhile(int data, int ms)
{
Thread.Sleep(ms);
return ++data;
}

二、异步执行:
异步执行:在主线程在执行的时候,打开一个子线程,主线程继续执行,当主线程需要子线程运行的结果的时候,主线程直接调用子线程运行结果,如果在调用的时候子线程还没有执行完成,主线程等待,直到子线程执行完成,主线程再继续执行。
下面是异步执行的流程图

接下来我们看看代码中的异步执行

static void Main(string[] args)
{
#region 异步执行
Func<int, int, int> d2 = TakeAWhile;
IAsyncResult ar = d2.BeginInvoke(1, 3000, null, null);
while (!ar.IsCompleted)
{
Console.Write(".");
Thread.Sleep(50);
}
int result = d2.EndInvoke(ar);
Console.Write("result:{0}",result);
#endregion
}
static int TakeAWhile(int data, int ms)
{
Console.Write("TakesAWhile started");
Thread.Sleep(ms);
Console.WriteLine("TakeAWhile Completed");
return ++data;
}

三、异步回调
异步回调:主线程在执行的时候,打开一个子线程,主线程继续执行,当子线程执行完成的时候,主线程立即输出主线程的运行结果,主线程继续执行。
下面是异步回调执行的流程图

接下来我们看看代码中的异步回调

static void Main(string[] args)
{
#region 异步回调
Func<int, int, int> dl = TakeAWhile;
dl.BeginInvoke(1, 3000, TakesAWhileCompleted, dl);
for (int i = 0; i < 100; i++)
{
Console.Write(".");
Thread.Sleep(50);
}
#endregion
}
static int TakeAWhile(int data, int ms)
{
Console.Write("TakesAWhile started");
Thread.Sleep(ms);
Console.WriteLine("TakeAWhile Completed");
return ++data;
}
static void TakesAWhileCompleted(IAsyncResult ar)
{
if (ar == null)
throw new ArgumentNullException("ar");
Func<int, int, int> dl = (Func<int, int, int>)ar.AsyncState;
int result = dl.EndInvoke(ar);
Console.WriteLine("Result:{0}",result);
}

C#基础:线程之异步回调(委托)的更多相关文章
- AsyncCallback 异步回调委托
		
js是单线程语言,单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务.如果前一个任务耗时很长,后一个任务就不得不一直等着. 如果排队是因为计算量大,CPU忙不过来,倒也算了,但是很多 ...
 - C# 多线程系列之异步回调(委托)
		
本文参考自C#基础:线程之异步回调(委托),纯属读书笔记 在解析异步回调之前,先看同步回调的执行过程,以及代码原理. 1.线程的同步执行 同步执行:在主线程执行的时候,主线程调用一个其它方法,此时主线 ...
 - C#(同步调用、异步调用、异步回调)
		
Review: 原作者虽然使用了汉字的类名,看起来十分蹩脚,但是,还是把同步调用.异步调用.异步回调的使用讲解的很详细的.原理讲解的很清晰. ------ 本文将主要通过“同步调用”.“异步调用”.“ ...
 - Future 异步回调 大起底之 Java Future 与 Guava Future
		
目录 写在前面 1. Future模式异步回调大起底 1.1. 从泡茶的案例说起 1.2. 何为异步回调 1.2.1. 同步.异步.阻塞.非阻塞 1.2.2. 阻塞模式的泡茶案例图解 1.2.3. 回 ...
 - c#线程之异步委托begininvoke、invoke、AsyncWaitHandle.WaitOne 、异步回调
		
单靠自己看书学总是会走很多弯路,任何人也不列外,有些时候自己遇到的很多问题,其它别人在很久之前也可能遇到过,上网查查可以走很大捷径,对自己的学习有很大帮助,刚开始弄线程这块,一开始只是看书,很多东西都 ...
 - C#基础:线程之异步委托
		
线程:是程序中独立的指令流.在我们熟悉的Visual Studio编辑器中输入C# 代码的时候,系统会自动分析代码,提示你输入的代码出现的各种错误,这是一个后台线程完成的. 创建线程的一种简单的方式就 ...
 - 委托(delegate)的三种调用方式:同步调用,异步调用,异步回调(转载)
		
下面为即将被调用的方法: public delegate int AddHandler(int a,int b); public class 加法类 { public static int Add(i ...
 - 协程 & 用户级(内核级)线程 & 切换开销 & 协程与异步回调的差异
		
今天先是看到多线程级别的内容,然后又看到协程的内容. 基本的领会是,协程是对异步回调方式的一种变换,同样是在一个线程内,协程通过主动放弃时间片交由其他协程执行来协作,故名协程. 而协程很早就有了,那时 ...
 - C# 委托的三种调用示例(同步调用 异步调用 异步回调)
		
首先,通过代码定义一个委托和下面三个示例将要调用的方法: 复制代码 代码如下: public delegate int AddHandler(int a,int b); public class ...
 
随机推荐
- 备忘:js正则表达式中的元字符
			
Predefined term Matches \t Horizontal tab \b Backspace \v Vertical tab \f Form feed \r Carriage retu ...
 - HDU5363:Key Set
			
Problem Description soda has a set S with n integers {1,2,-,n}. A set is called key set if the sum o ...
 - iOS 图像处理-剪裁图像
			
解决这个问题:依照某一长宽比例,剪裁图片的上部和下部.保留中间的内容.当然也能够自己定义须要剪裁留下的区域 前提:须要加入Framework:CoreGraphics.framework 代码: - ...
 - repeter中应用三元运算符
			
应用情景一:根据ID显示名称例如:0代表启动,1:代表关闭例子如下 <td><%#Eval("ID").ToString() == "0" ? ...
 - hdu 1542&&poj 1151 Atlantis[线段树+扫描线求矩形面积的并]
			
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
 - 嵌套的EasyUI 怎么获取对象
			
说明: 1.本篇文章介绍的是,怎么获取嵌套的Easyui 中的id为pageDetail的iframe对象 2.刚开始的页面效果如下图,是一个只有north,center区域的easyUI easy ...
 - Protocol_ISIS
			
集成ISIS协议 作者:Danbo 2015-7-5 ISIS的意思是表示中间系统,并且是为OSI无连接网络协议(OSI Conectionless Network Protocol,CLNP)设计的 ...
 - Redis C语言操作封装
			
#ifndef BOYAA_FOURLANDLORD_REDISCLASS_H_20130217 #define BOYAA_FOURLANDLORD_REDISCLASS_H_20130217 #i ...
 - linux应用之nginx的安装及配置(centos)
			
Ubuntu/CentOS 系统上安装与配置Nginx 一.在线安装: Ubuntu:sudo apt-get install nginx CentOS: sudo yum install nginx ...
 - HihoCoder 1638 : 小Hi的天平 (2-sat+并查集)
			
描述 小Hi给小Ho邮寄了一个天平.收到天平后,小Ho想知道天平在运输过程中是否损坏,为此它准备了A类物品和B类物品共n个(可能只有A类物品,也可能只有B类物品),但无法确定一个物品是哪一类.A类物品 ...