异步委托的执行是在辅助线程中进行的,所以异步委托也是多线程的一种技术
首先定义一个委托
public delegate void mydelgate ();
这是最简单一个委托类型,没有返回值,也没有参数,定义一个方法
private void Method() { Console.WriteLine ("thread is running,thread Id is: {0}",Thread.CurrentThread.ManagedThreadId); }
定义一个委托对象
mydelgate del = Method;//new mydelgate (Method);
委托对象可以用上面任意两种方法实例化,下面的代码就关键了
del.BeginInvoke (null,"del")
每个委托类型都会有两个方法BeginInvoke和EndEnvoke,分别表示开始调用,和结束调用,该方法,会将委托的调用至于
新线程中,以起到异步,不阻塞主线程的作用,上面的两个参数,第一个为AsyncCallBack类型,表示异步委托调用结束后
调用什么该方法,这里我们不需要在委托结束后调用任何方法,所以设为null,第二个参数是 object类型的参数,作为额外
参数,传入异步委托中,可以是任何值,一般用来标识委托,该方法还返回一个IAsyncResult对象.
如果定义一个带参数的委托
public delegate void mydelgate2(int a,int b);
调用的时候就需要这样调用
del.BegingInvoke(a,b,null,"dell")
最前面的两个参数就是该委托需要传入的参数,顺序和声明是一致的
对于有返回值的委托,如
public delegate int AddDelegate(int a,int b)
我们如果需要取回返回值,就需要这样,假设有一个该委托的实例add
IAsyncResult asyncResult= add.BeginInvoke(2,3,null,"add"); int result = add.EngEnvoke(asyncResult);
注意一旦调用EndEnvoke方法,就会进入阻塞模式,等待委托执行完毕,当然如果委托已经执行完毕,就可以立马取得结果,
这里EndEnvoke必须接受一个IAsyncResult对象。
原文:http://www.cnblogs.com/yayaxxww/p/3547960.html