C# BeginInvoke与EndInvoke的使用

摘要:
我之前已经说过BeginInvoke和Invoke之间的相似之处和不同之处。在这里,我们将再次讨论endinvoke。我们知道BeginInvoke通过线程调用异步完成了一些工作。例如,如果begininvoke用于修改界面显示,它将在每次发生更改时自动更改界面显示,因为它是在后台运行的。此时,我们需要结束调用。首先,让我们看看begininvoke:1:publicinterfaceIAsyncResult2:{3:objectAsyncState{get;}的返回值类型4: 5:WaitHandleAsyncWaitHandl{get;}6: 7:boolCompleted同步{get;}8: 9:boolIsCompleted{get;}10: 根据BeginInvoke返回的结果,我们有两种方法调用异步操作:轮询IAsyncResult的IsCompleted属性将在异步操作后返回true,否则将返回false。

之前,我已经说过了BeginInvoke与Invoke的异同

这里就要再来说说endinvoke的意思了

我们知道 beginvoke就是通过线程的调用来异步的完成一些工作。一般只需要启动它就好,让它一直操作着。例如 用begininvoke修改界面显示,那么就是每次有所变化时它自动的改变界面的显示,因为它在后台执行着。

但是有时候我们需要知道它的结束信息,并且在结束时还有所安排。这时候就需要endinvoke了

先来看看,begininvoke的返回值类型:

复制代码
1: publicinterfaceIAsyncResult
2: {
3: objectAsyncState { get; }
4:
5: WaitHandle AsyncWaitHandle { get; }
6:
7: boolCompletedSynchronously { get; }
8:
9: boolIsCompleted { get; }
10: }
复制代码

根据BeginInvoke返回的结果,我们就有两种调用异步操作的方式:

轮询

IAsyncResult的IsCompleted属性会在异步操作结束后返回true,否则返回false。那么我们就可以用一个循环不断的访问IsCompleted属性,当IsCompleted为true的时候再调用EndInvoke方法

复制代码
//这里用到的是.Net中定义好的委托来执行BeginInvokeFunc<int>longTimeAction =newFunc<int>(LongTimeMethod);
IAsyncResult asynResult
=longTimeAction.BeginInvoke(null, null);
//可以做别的事情while(!asynResult.IsCompleted)
{
//当不是true时,就执行这里的代码
}
intresult =longTimeAction.EndInvoke(asynResult);//当是true时,就将结果返回显示
复制代码

WaitOne

在IAsyncResult里还有一个AsyncWaitHandle属性,这是一个WaitHandle类型的属性,这个对象有一个WaitOne方法,还能接受一个超时时间,它会等待这个超时时间指定的长度:

复制代码

Func
<int>longTimeAction =newFunc<int>(LongTimeMethod);
IAsyncResult asynResult
=longTimeAction.BeginInvoke(null, null);
//可以继续处理别的事情if(asynResult.AsyncWaitHandle.WaitOne(10000, true))//判断是不是结果为true,只等你10s
{
intresult =longTimeAction.EndInvoke(asynResult);
}
复制代码

在invoke之后,继续做别的事,做完了就来这里等着返回结果,如果invoke操作太慢了就只好错过了~~

回调

其实不管是上面使用轮询的方式还是使用WaitOne等待一个信号量,还是要等待。等待是个让人很恼火的事情。.Net考虑了这一点,为我们准备了回调的方式:你异步调用后继续干你的事儿,等你执行完后,你告我一声就ok了。

Func<int>longTimeAction =newFunc<int>(LongTimeMethod);
//这里使用了一个lambda表达式,省了不少力啊IAsyncResult asynResult =longTimeAction.BeginInvoke((result) =>{
intret =longTimeAction.EndInvoke(result);
},
null);

当异步操作完成后,上面代码中用lambda表达式表示的一个回调方法就会执行,在这里调用EndInvoke获取耗时操作的结果。

转自:http://www.cnblogs.com/Tammie/archive/2011/09/07/2169491.html

免责声明:文章转载自《C# BeginInvoke与EndInvoke的使用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇MapXtreme 2005学习(5):总结查找图元的三种方法Google Guava之简化异常和错误的传播与检查下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

将Kafka收到的数据传入到redis中

首先,配置配置。在属性测试中,首先启动网络管理系统(GateWay),然后启动终端(TBox),然后运行KafkaTest启动TBox。在启动测试中可以看到收到的数据。然后关键是sdf,然后去你的xshell启动动物园管理员、kafka和redis...

您的硬件设置已被更改,请重新启动计算机,使更改生效

在Win7旗舰系统上,出现“您的硬件设置已更改,请重新启动计算机以使更改生效”。开机后将弹出“您的硬件设置已更改,请重新启动计算机”窗口。不要关闭它。打开任务管理器,右键单击以转到进程,查看其中是否有正在运行的进程。进程名称为:atieclxx.exe右键单击进程打开文件的位置。将此程序移出原始文件夹(最好是另一个磁盘),然后重新启动计算机。...

mysql之排序查询

高级文章目录3:排序查询功能:1.按单个字段排序案例1:查询员工信息,要求工资从高到低排序2.为排序添加筛选条件案例1:部门编号˃=90的员工信息,按员工编号降序排序案例2:部门编号˃=90的人员信息,按输入时间排序。按表达式排序案例1:按年薪显示员工信息和年薪4按别名排序案例1按年薪升序查询员工信息5.按函数(长度)排序案例1查询员工姓名并按姓名长度减少...

git使用说明

初次使用请参考百度,google,博客园。1修改文件并提交到github[luwenwei@dev01v~/git/helww/labs]$vimREADME[luwenwei@dev01v~/git/helww/labs]$gitdiffdiff--gita/READMEb/READMEindex39d8172..464c83f100644---a/REA...

MySQL 字段类型占用空间

MySQL支持多种列类型:数值类型、日期/时间类型和字符串(字符)类型。)1或2个字节,取决于枚举值的个数SET(‘value1’,’value2’,…)1、2、3、4或者8个字节,取决于set成员的数目上表的M只是为了说明占用空间大小,在实际创建表中char、varchar,20指的是字符而不是字节;那么字符和字节的转换要看字符集,utf-8下,1字符=3...

sqlserver2016安装

2008以前的版本在SQLserver配置管理其中设置。...