C#-异步委托

1. 什么是异步委托
1)异步委托是采用异步回调的方式实现异步执行,当使用委托异步执行某个方法时,将从线程池中取出一个线程去执行该方法。

2)当执行完成后则调用 AsyncCallback 委托指定的方法,完成异步回调。


 class Program
    {
        static void Main(string[] args)
        {
            //获取主线程ID
            Console.WriteLine("主线程id:" + Thread.CurrentThread.ManagedThreadId);

            Func<int, int, string> func = (a, b) => { Console.WriteLine("Delegate线程ID:" + Thread.CurrentThread.ManagedThreadId); Thread.Sleep(2000); return (a + b).ToString(); };

            //异步执行委托
            #region 异步委托简单方式
            //IAsyncResult result = func.BeginInvoke(5, 5, null, null);
            //string s = func.EndInvoke(result);
            //Console.WriteLine(result.IsCompleted);//true
            //Console.WriteLine(s);
            //Console.WriteLine("成功被EndInvoke函数阻挡"); 
            #endregion

            #region 有回调函数的异步委托
            //AsyncCallback
            IAsyncResult result = func.BeginInvoke(5, 5, MyAsyncCallback, func);//最后一个参数直接把委托传过来

            #endregion

            Console.ReadKey();

        }
        public static void MyAsyncCallback(IAsyncResult ar)
        {    //由执行异步委托的线程执行,不会阻塞主线程
             //拿到异步执行的结果
             //获取对异步结果封装的类
             //AsyncResult result = (AsyncResult)ar;
             //Func<int,int,string> funcs=(Func<int,int,string>)result.AsyncDelegate;
             //string str=funcs.EndInvoke(result);



            //获取传过来啊的委托对象
            Func<int, int, string> funcs = (Func<int, int, string>)ar.AsyncState;//ar.AsyncState;拿到传过来的最后一个参数相关数据
            string str = funcs.EndInvoke(ar);
            Console.WriteLine(str);
        }
    }

异步委托可以获取线程返回值,而单开线程执行方法无法获取其返回值,是与线程的不同点

总结:

  • 异步委托主要是使用BeginInvoke()方法开启异步委托,该方法传入一个回调委托AsyncCallBack对象
  • BeginInvoke()返回一个实现了IasynResult接口的对象,可以使用该对象的 AsyncWaitHandle.WaitOne() 方法和 IsCompleted 属性判断异步是否完成。
  • 需要获取异步委托的返回结果,都必须调用 EndInvoke() 方法。
  • AsyncState :获取用户定义的对象,它限定或包含关于异步操作的信息(BeginInvoke函数最后的传入参数)。
发布了83 篇原创文章 · 获赞 11 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/MrLsss/article/details/104282610