delegate.BeginInvoke 注意事项

来源:互联网 发布:windows 删除服务工具 编辑:程序博客网 时间:2024/05/18 02:47

在工作中经常用到一些异步处理,这时会用到多线程。其实在很多时候都可以使用 delegate.BeginInvoke的方式来实现异步,避免了使用线程类。

但作为一个基础的知识点,您还是应该注意:

1、参数传递:
   private Func<int,string> DoSomting;
   private void Do()
   {
      DoSomting = new Func<int,string>(ShowMess);

      AsyncCallback callBack = new AsyncCallback(CallBack);
      IAsyncResult re = DoSomting.BeginInvoke( 10 /*代理所指方法的参数列表*/ , CallBack /*回掉方法*/ , null/*需要给CallBack方法的参数*/ );
      DoSomting.EndInvoke(re);
   }
   private string ShowMess(int value)
   {
      return "测试";
   }
   private void CallBack(IAsyncResult re)
   {
   }
2、返回值
   获取 EndInvoke 执行后的返回值。
   更改上面的代码,获取ShowMess的返回值

   IAsyncResult re = DoSomting.BeginInvoke( 10 , CallBack  , null);
   var mess = DoSomting.EndInvoke(re);//mess 为ShowMess方法的返回值

3、BeginInvoke 回掉方法的执行.

   private void CallBack(IAsyncResult re)
   {
            Func<int,string> doSomting = re.AsyncState as Func<int, string>;
            doSomting.EndInvoke(re);

            MessageBox.Show("完成!");
   }

   a、传递参数
      IAsyncResult re = DoSomting.BeginInvoke( 10 /*代理所指方法的参数列表*/ , CallBack /*回掉方法*/ , DoSomting/*需要给CallBack方法的参数*/ );
   b、使用re.AsyncState获取参数.

4、IAsyncResult 的 AsyncWaitHandle.WaitOne(int,bool);的执行。
  
   int : 表示等待的时间。

   bool: true 在等待int间隔后,如果还未结束,则继续等待。
         false在等待int间隔后,如果还未结束,则终止等待。

原创粉丝点击