zoukankan      html  css  js  c++  java
  • AsyncDelegate

    需要使用的方法,委托:

       static int GetSum(int n1, int n2)
            {
                Console.WriteLine("===================异步调用的函数GetSum中的线程Id:{0}", Thread.CurrentThread.ManagedThreadId);
    
                int sum = 0;
                for (int i = n1; i <= n2; i++)
                {
                    sum += i;
                    Thread.Sleep(100);
                }
                Console.WriteLine("方法中输出的结果:{0}", sum);
                return sum;
            }
    public delegate int MyDelegate(int n1, int n2);
    

    一、正常调用Sum方法,比较耗时

                MyDelegate md = new MyDelegate(GetSum);
                int sum = md(1, 30);
                Console.WriteLine("主方法中输出的Sum:{0}", sum);
                Console.ReadKey();
    

    二、基本使用异步委托

      //1.异步调用委托
                MyDelegate md = new MyDelegate(GetSum);
                //开始异步调用委托
                //BeginInvoke()返回值就是返回了一个对象,这个对象实现了IAsyncResult接口,并且该对象中封装了一些关于当前异步执行的委托的一些状态信息。
                IAsyncResult asyncResult = md.BeginInvoke(1, 30, null, null);
                for (int i = 0; i < 10; i++)
                {
                    Console.WriteLine("主线程继续执行.." + i);
                }
                //调用EndInvoke会阻塞线程,等待异步委托执行完毕。拿到返回值。
                int sum = md.EndInvoke(asyncResult);
                Console.WriteLine("方法执行的返回值为:{0}", sum);
                Console.WriteLine("主线程继续........");
    

    三、异步委托的其他信息,引用上面开始调用委托的返回值asyncResult

    //asyncResult.IsCompleted  当前线程委托有没有执行完毕
      bool isEnd = asyncResult.AsyncWaitHandle.WaitOne(1000);//1000毫秒表示超时时间,如果等待了1000毫秒 线程还没有结束的话 那么这个方法会返回false 如果在1000毫秒以内线程结束了,那么这个方法会返回true
                if (isEnd)
                {
                    int res = md.EndInvoke(asyncResult);
                    Console.WriteLine(res);
                }
    

    四、异步委托带回调函数

     //=======异步调用委托中的回调问题======================
                MyDelegate md = GetSum;
                //开始异步调用委托
                IAsyncResult result = md.BeginInvoke(1, 30, new AsyncCallback(Callback),"Test");
                Console.WriteLine("主线程继续执行。。。。。");
                Console.ReadKey();
    
    //该回调函数有系统自动调用,当指定的异步委托调用完毕后,自动调用该方法,并把BeginInvoke得到的返回值传进去

    static void Callback(IAsyncResult syncResult) { Console.WriteLine("===================回调函数中的线程Id:{0}", Thread.CurrentThread.ManagedThreadId); //syncResult.AsyncState获取的就是BeginInvoke()中的最后一个参数。 Console.WriteLine("回调函数的参数:{0}", syncResult.AsyncState); //在回调函数中调用EndInvoke()方法就可以获取返回值。 //需要把接口类型转换为具体的对象 AsyncResult ar = syncResult as AsyncResult; int sum = ((MyDelegate)ar.AsyncDelegate).EndInvoke(ar); Console.WriteLine("返回值是:{0}", sum); }
  • 相关阅读:
    Socket编程实现客户端与服务器一对一聊天
    HttpClient获取页面信息与Jsoup封装获取
    代码推送
    re正则
    MySQL 的主从复制
    关于前后端的缓存
    session/cookie/token
    如何保证缓存(redis)与数据库(MySQL)的一致性
    进程与线程(程序与任务)
    QA/QC
  • 原文地址:https://www.cnblogs.com/entclark/p/8026469.html
Copyright © 2011-2022 走看看