异步委托操作BeginInvoke和EndInvoke
BeginInvoke,有两个参数,一个调用方法的参数列表。
例如:
int Add(int i){ }
TestDelegate td=new TestDelegate(Add);
td.BeginInvoke(1/*params*/,null,null);
代码中 1 就是参数列表了,数量可以是0-N,数量对应方法的参数个数!
列表参数之后就是第一个参数AsyncCallback callback,这个参数也许也是个委托吧!如果方法执行完毕。就调用callback的方法执行后续。这个可为null
第三个参数是Object asyncState,如果第二个参数不用,也就不用了,直接null,如果第二个参数有,通常就传这个委托对象过去。因为MSDN上说这样方便在callback中调用EndInvoke;
EndInvoke,有一个参数列表,一个参数
参数列表是,由于调用既方法,有ref 或者out参数,才需要的。
另一个参数是IAsyncResult类型,MSDN用几个字描述了:表示异步操作的状态。
还有就是MSDN声明了一个要点就是
每次都要调用 EndInvoke 来完成异步调用。
调用的大概流程就是
第一步:IAsyncResult result =xyzdelegate.BeginInvoke(a,null,null) (个人认为,如果有callback就不用result了,不过未经证实)
第二步:有两种方法知道呢个异步调用既完成
(1)result.AsyncWaitHandle.WaitOne();这个会一直等,等到真是完成!才会执行下一行代码!
(2)
while(result.IsCompleted == false){
呢度你做咩野无人理,当然调用既方法还在执行!
}
第三步object return_value=xyzdelegate.EndInvoke(result);其中object 可以改为函数的返回类型。
如果用到AsyncCallback则要再定义一个函数:
void funtion_name(IAsyncResult result)
那样
EndInvoke就中这个Callback函数中执行,当然代码你要自已写.至于调用EndInvoke的对象就是(xyzdelegate)result.AsyncState
ps:这个xyzdelegate是自自己定的。