C# 并行编程之异步委托

异步委托的执行是在辅助线程中进行的,所以异步委托也是多线程的一种技术

首先定义一个委托

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对象。