异步委托

Posted xiaoyaohan

tags:

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

异步委托的简单方式

 #region 异步委托 简单的方式
            Func<int, int, string> delFunc = (a, b) =>
            {
                Console.WriteLine("Delegate Thread:" + Thread.CurrentThread.ManagedThreadId);
                return (a+b).ToString();
            };
            //拿到异步委托的结果
            IAsyncResult result = delFunc.BeginInvoke(3, 4, null, null);
            string str = delFunc.EndInvoke(result);//EndInvoke方法会阻塞当前线程,直到异步委托指向完成之后才往下执行
            Console.WriteLine(str);
            Console.ReadKey();

            #endregion


有回调函数的异步委托

 #region 有回调函数的异步委托
            //先写一个有返回值的委托实例
            Func<int, int, string> delFunc = (a, b) =>
            {
              
                return (a + b).ToString();
            };
            delFunc.BeginInvoke(5, 6, MyAsyncCallback, "123");//在下面生成MyAsyncCallback()方法
            Console.ReadKey();
           

        }

        public static void MyAsyncCallback(IAsyncResult ar)
        {
            //拿到异步委托的结果
            AsyncResult result = (AsyncResult)ar;//强转成子类的类型
            var del = (Func<int,int,string>)result.AsyncDelegate;//result.AsyncDelegate直接指向了委托实例delFunc
            string returnValue= del.EndInvoke(result);
            Console.WriteLine("返回值是" + returnValue);

            //拿到回调函数的参数
            Console.WriteLine("回调函数的线程ID是:" + Thread.CurrentThread.ManagedThreadId);
            Console.WriteLine("回调函数的参数是:"+result.AsyncState);
        }
        #endregion

 

有回调函数的异步委托的另一种方法是 直接在回调函数中将委托作为参数

//另一种方法
        Func<int, int, string> delFunc = (a, b) =>
        {

            return (a + b).ToString();
        };
        delFunc.BeginInvoke(5, 6, MyAsyncCallback,delFunc );//在下面生成MyAsyncCallback()方法,直接将委托作为参数
            Console.ReadKey();
           

        }

        private static void MyAsyncCallback(IAsyncResult ar)
        {
            var del = (Func<int,int,string>)ar.AsyncState;
            string str = del.EndInvoke(ar);
        }

 


以上是关于异步委托的主要内容,如果未能解决你的问题,请参考以下文章

异步委托

C# Winform 多线程异步委托进度条

.Net 异步委托中止

C#委托异步调用

您如何实现异步操作委托方法?

如何将异步Func或Action转换为委托并调用它