C# 异步调用(存档)

来源:互联网 发布:网络暑假工招聘 编辑:程序博客网 时间:2024/04/30 20:51

 我们要明确,为什么要进行异步回调?众所周知,普通方法运行,是单线程的,如果中途有大型操作(如:读取大文件,大批量操作数据库,网络传输等),都会导致方法阻塞,表现在界面上就是,程序卡或者死掉,界面元素不动了,不响应了。异步方法很好的解决了这些问题,异步执行某个方法,程序立即开辟一个新线程去运行你的方法,主线程包括界面就不会死掉了。异步如何开始,好理解,现在我们讨论的是如何结束这个异步出来的新线程。
       首先,异步出来的新线程,必须回收,不回收是浪费资源的可耻行为,.NET也是不允许的,所以你别想钻空子,俗话说,请神容易送神难,就是这个道理。下面你可以很容易想到,回收分为2种情况:主动回收和被动回收(当然,这是我自己的理解,微软可不是这么说的),主动回收就是,你去监视那个线程,并且等待,当异步方法完成了,就把异步线程回收,焦点回归主线程,实际上就是上篇文章《C#异步初步》的那种情况,BeginInvoke之后又EndInvoke,如果在EndInvoke的时候,该异步线程没有完成操作,那么整个程序,包括主线程,又在阻塞了,又会出现界面“死”的情况。要想解决这个问题,就使用“被动回收”方式,其中一个重要的办法就是“异步回调”。
         
核心有二:
    
A、   用回调函数(本例中为CallBackMethod
),异步结束后,自动调用此回调函数。    
    
B、   
而不在主线程中手工等待异步结束,如上两例中在主线程中调用EndInvoke。此种方法,是在回调函数中调用EndInvoke的。
     异步回调的大概流程是这样的:首先启动异步,启动参数加上异步结束时执行的方法,然后这个异步线程就不用管了,最后当这个异步线程自己完成工作了,就自动执行启动参数里的那个方法,这样确实很省心,可是代码写起来,就很复杂了。
    下面是搜藏的代码:
 

  1.         //首先准备好,要进行异步的方法(能异步的,最好不多线程)
  2.         private string MethodName(int Num, out int Num2)
  3.         {
  4.                        Num2 = Num;
  5.                        return "HelloWorld";
  6.         } 
  7.         //程序终点
  8.         //异步完成时,执行的方法(回调方法),此方法只能有IAsyncResult一个参数,但是该参数几乎万能,可以传递object
  9.         private void CallBackMethod(IAsyncResult ar)
  10.         {
  11.                        //从异步状态ar.AsyncState中,获取委托对象
  12.                        DelegateName dn = (DelegateName)ar.AsyncState;
  13.                        //输出参数
  14.                        int i;
  15.                        //一定要EndInvoke,否则你的下场很惨
  16.                        string r = dn.EndInvoke(out i, ar);
  17.                        MessageBox.Show("异步完成喽!i的值是" i.ToString() ",r的值是" r);
  18.         }
  19.         //定义与方法同签名的委托
  20.         private delegate string DelegateName(int Num, out int Num2);
  21.         //程序入口
  22.         private void Run()
  23.         {
  24.                //实例化委托并初赋值
  25.                DelegateName dn = new DelegateName(MethodName);
  26.                //输出参数
  27.                int i;
  28.                //实例化回调方法
  29.                //把AsyncCallback看成Delegate你就懂了,实际上AsyncCallback是一种特殊的Delegate,就像Event似的
  30.                AsyncCallback acb = new AsyncCallback(CallBackMethod);
  31.                //异步开始
  32.                //如果参数acb换成null则表示没有回调方法
  33.                //最后一个参数dn的地方,可以换成任意对象,该对象可以被回调方法从参数中获取出来,写成null也可以。参数dn相当于该线程的ID,如果有多个异步线程,可以都是null,但是绝对不能一样,不能是同一个object,否则异常
  34.                IAsyncResult iar = dn.BeginInvoke(1, out i, acb, dn);
  35.                //去做别的事
  36.                //…………
  37.         }
  38.         //最后的结果应该是:i=1,r="HelloWorld"
  39. //另外,如果可以,定义委托的时候可以选择不用过多的修饰: 
  40.         /// <summary>
  41.         /// 定义委托
  42.         /// </summary>
  43.         /// <returns></returns>
  44.         public delegate bool Asyncdelegate();
  45.         /// <summary>
  46.         /// Callback method must have the same signature as the
  47.         /// AsyncCallback delegate
  48.         /// </summary>
  49.         /// <param name="ar"></param>
  50.         private void CallbackMethod(IAsyncResult ar)
  51.         {
  52.             // Retrieve the delegate.
  53.             Asyncdelegate dlgt = (Asyncdelegate)ar.AsyncState;
  54.             // Call EndInvoke to retrieve the results.
  55.             dlgt.EndInvoke(ar);
  56.         }
  57.  //其他方法中调用:
  58.         //异步执行      
  59.         //指定委托方法      
  60.         Asyncdelegate isgt = new Asyncdelegate(icpInfo.Insert);
  61.         IAsyncResult ar = isgt.BeginInvoke(new AsyncCallback(CallbackMethod), isgt);

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 一岁半小宝宝不爱吃饭怎么办 家养的小鸡打架怎么办 小鸡关在一起打架怎么办 小孩感冒出汗多怎么办 宝宝感冒出汗了怎么办 出汗多怎么办%3f 孩子睡觉出汗多怎么办 三年级孩子成绩下滑怎么办 幼儿数学不开窍怎么办 孩子一年级学习跟不上怎么办 孩子学习不认真怎么办 孩子平时不细心怎么办? 脖子出现黑圈怎么办 简历留白太多怎么办 excel数字外面加个圈怎么办 电脑输入法数字数不上怎么办 大班教案迷路了怎么办 迷路了怎么办活动反思 头突然眩晕是怎么办 孩子学习拖拉懒惰怎么办 头发晕想睡觉怎么办 五年级错别字多怎么办 入党志愿书写错字怎么办 高中不会写作文怎么办 考试不会写作文怎么办 高考不会写作文怎么办 孩子总是写错字怎么办 小孩总是写错字怎么办 孩子马虎不认真怎么办 小孩计算老出错怎么办 小学生计算总出错怎么办 高中考试总粗心怎么办 孩子考试总是粗心怎么办 一年级孩子考试粗心怎么办 老师说孩子粗心怎么办 计算题总出错怎么办 计算题总是出错怎么办 数学老是计算错误怎么办? 苗木抵扣计算错误怎么办 表格中计算错误怎么办 孩子电视瘾太大怎么办