异步委托操作BeginInvoke和EndInvoke

BeginInvoke,有两个参数,一个调用方法的参数列表。

例如:

delegate int TestDelegate(int i);
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是自自己定的。

原文地址:https://www.cnblogs.com/mlog/p/2456406.html