c#begininvoke和invoke,begininvoke
之前我已经说过BeginInvoke和Invoke的异同。
endinvoke的意思是。
我们知道beginvoke就是通过调用线程来异步完成一些工作。一般来说,你只需要启动它,并保持其运行。比如你用begininvoke修改界面显示,它每次修改都会自动改变界面显示,因为是在后台执行的。
但是有时候我们需要知道它的结尾信息,我们在结尾有计划。这时你就需要endinvoke了。
让我们来看看begininvoke的返回值类型:
1:公共接口IAsyncResult
2: {
3:对象AsyncState { get}
4:
5:wait handle AsyncWaitHandle { get;}
6:
7:bool synchronously completed { get;}
8:
9:bool is completed { get;}
10: }
根据BeginInvoke返回的结果,我们有两种方法调用异步操作:
IAsyncResult的IsCompleted属性在异步操作后将返回true,否则将返回false。然后我们可以在一个循环中访问IsCompleted属性,然后在IsCompleted为true时调用EndInvoke方法。
//在中定义的委托。Net在这里用来执行BeginInvoke
Func int long time action=new Func int(long time method);
IAsyncResult asyn result=long time action。BeginInvoke(null,null);
//你可以做其他事情
而(!异步结果。IsCompleted)
{
//当它不为真时,执行此处的代码
}
int result=longTimeAction。endin voke(asyn result);//为真时,返回结果显示。
等等
IAsyncResult中还有一个AsyncWaitHandle属性,它是一个WaitHandle类型属性。这个对象有一个WaitOne方法,它也可以接受一个超时,它将等待这个超时的指定长度:
Func int long time action=new Func int(long time method);
IAsyncResult asyn result=long time action。BeginInvoke(null,null);
//你可以继续处理其他事情
If (asynresult。asyncwaithandle.waitone (10000,true))//判断结果是否为真,只等你10s。
{
int result=longTimeAction。endin voke(asyn result);
}
调用后,继续做其他事情。做完了就过来等结果。如果invoke太慢,你就只能错过了~ ~
其实不管上面的方法是polling还是WaitOne用来等待一个信号量,还是要等的。等待是一件很讨厌的事情。Net考虑到了这一点,为我们准备了一个回调方法:你进行异步调用后,继续做你的业务,完成后通知我一声即可。
Func int long time action=new Func int(long time method);
//这里用了一个lambda表达式,很省力。
IAsyncResult asyn result=long time action。BeginInvoke((结果)={
int ret=longTimeAction。EndInvoke(结果);
},null);
异步操作完成后,会执行上面代码中lambda表达式表示的回调方法,其中调用EndInvoke得到耗时操作的结果。
转自:http://www.cnblogs.com/Tammie/archive/2011/09/07/2169491.html
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。