异步使用委托delegate --- BeginInvoke和EndInvoke方法

Posted heisehenbai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了异步使用委托delegate --- BeginInvoke和EndInvoke方法相关的知识,希望对你有一定的参考价值。

当我们定义一个委托的时候,一般语言运行时会自动帮委托定义BeginInvoke 和 EndInvoke两个方法,这两个方法的作用是可以异步调用委托。

方法BeginInvoke有两个参数:

  • AsyncCallBack:回调函数,是一个委托,没有返回值,可以传一个参数,参数类型是object;
  • object AsyncState :回调函数的参数。

BeginInvoke的返回值是IAsyncResult,

方法EndInvoke需要的参数是BeginInvoke的返回值IAsyncResult.

举例如下:

    class AsyncStateTest
    {
        private delegate void DelegateTest();

        public static void TestAsyncState()
        {
            DelegateTest delegateTest = new DelegateTest(delegateImpl);
            Console.WriteLine("Main method begin delegateTest");
            IAsyncResult asyncResult = delegateTest.BeginInvoke(new AsyncCallback(CallBack), "I am AsyncState(*_*)");
            //delegateTest.EndInvoke(asyncResult);
            Console.WriteLine("Main method end delegateTest");
            delegateTest.EndInvoke(asyncResult);
            Console.WriteLine("Main method continue");
        }

        private static void CallBack(IAsyncResult asyncResult)
        {
            object state = asyncResult.AsyncState;
            Console.WriteLine(state.ToString());
        }

        private static void delegateImpl()
        {
            Console.WriteLine("I am DelegateTest Impl");
        }
    }

运行结果:

Main method begin delegateTest
Main method end delegateTest
I am DelegateTest Impl
Main method continue
I am AsyncState(*_*)

可以看到,主线程的输出先于委托方法的输出,证明该方法被异步执行了。另外EndInvoke方法的作用是阻塞线程(调用委托的主线程),使之等到委托的方法执行完毕(但是不会等到委托的回调函数执行完毕),上面的代码换一下EndInvoke方法的位置可以看到结果。

以上是关于异步使用委托delegate --- BeginInvoke和EndInvoke方法的主要内容,如果未能解决你的问题,请参考以下文章

C# 多线程初级汇总

.Net 异步委托中止

从委托的源 ViewController 调用异步闭包

C#的异步回调函数

c# 委托 delegate

GroovyMOP 元对象协议与元编程 ( 方法委托 | 使用 @Delegate 注解进行方法委托 )