控件中国网现已改版,您看到的是老版本网站的镜像,系统正在为您跳转到新网站首页,请稍候.......
中国最专业的商业控件资讯网产品咨询电话:023-67870900 023-67871946
产品咨询EMAIL:SALES@COMPONENTCN.COM

异步调用方法的两种方式

作者:佚名 出处:CNBLOG 2010年04月14日 阅读:

异步调用方法的两种方式   

本文由控件中国网转载


当即将调用的方法执行比较耗时,且我们又不希望阻塞当前线程时,我们会选择异步执行该方法。

  一、新建线程

  1.无返回值的方法:

 private static void Hello()
 {
      Console.WriteLine("New Thread");
      Thread.Sleep(5000);
      Console.WriteLine("New Thread:Hello");
 }
 

  对于这个方法可以这样来执行:

 

 static void Main()
 {
     Console.WriteLine("Main Thread");
     var newThread = new Thread(Hello);
     newThread.Start();
     Console.WriteLine("Main Thread");
 }
 

  输出如下:

  Main Thread
  New Thread
  Main Thread
  New Thread:Hello
  Press any key to continue . . .

   2.有返回值的方法:

 

  private static string GenerateHello()
  {
       Console.WriteLine("New Thread");
       Thread.Sleep(5000);
       return "Hello";
  }
 

   由于新起线程并不能返回值,所以我们需要定义一个变量来保存这个值:

        static void Main()
        {
            var strHello = string.Empty;
            Console.WriteLine("Main Thread");
            var newThread = new Thread(()=>strHello=GenerateHello());
            newThread.Start();
            Console.WriteLine("Main Thread");
            Console.WriteLine(strHello);
        }
 

  输出如下:

  Main Thread
  New Thread
  Main Thread

  

  Press any key to continue . . .

   可见,strHello这时并没有值,但是我们又想得到它的值,怎么办呢?看来只有阻塞当前线程了。

        static void Main()
        {
            var strHello = string.Empty;
            Console.WriteLine("Main Thread");
            var newThread = new Thread(()=>strHello=GenerateHello());
            newThread.Start();
            Console.WriteLine("Main Thread");
            while (true)
            {
                if(!string.IsNullOrEmpty(strHello))
                {
                    Console.WriteLine("strHello:"+strHello);
                    break;
                }
            }
           
        }
 

 

  输出如下:

  Main Thread
  Main Thread
  New Thread
  strHello:Hello
  Press any key to continue . . .

 

  二、使用委托

  1.无返回值的方法

        private delegate void SayHello();
        static void Main()
        {
            Console.WriteLine("Main Thread");
            SayHello sayHello = Hello;
            var async = sayHello.BeginInvoke(null, null);
            Console.WriteLine("Main Thread");
            sayHello.EndInvoke(async);
        }
 

  输出如下:

  Main Thread
  Main Thread
  New Thread
  New Thread:Hello
  Press any key to continue . . .

  EndInvoke会阻塞当前线程直到方法执行完成。

  2.有返回值的方法:

  使用委托来获取值就容易了。

 

        private delegate string GetHello();
        static void Main()
        {
            Console.WriteLine("Main Thread");
            GetHello sayHello = GenerateHello;
            var async = sayHello.BeginInvoke(null, null);
            Console.WriteLine("Main Thread");
            var strHello = sayHello.EndInvoke(async);
            Console.WriteLine(strHello);
        }
 

   EndInvoke会返回委托所代表方法返回的值。

  3.其他

  (1).BeginInvoke

  BeginInvoke的声明如下:

  public virtual IAsyncResult BeginInvoke(AsyncCallback callback, object @object);

  callback是异步方法执行完成时回执行的回调方法,而object则是传递给回调方法的参数。

  三、小结

  可见一般使用新起线程来异步调用无返回值的方法,而使用委托来调用有返回值的方法。


本文由控件中国网转载

热推产品

  • ActiveReport... 强大的.NET报表设计、浏览、打印、转换控件,可以同时用于WindowsForms谀坔攀戀Forms平台下......
  • AnyChart AnyChart使你可以创建出绚丽的交互式的Flash和HTML5的图表和仪表控件。可以用于仪表盘的创......
首页 | 新闻中心 | 产品中心 | 技术文档 | 友情连接 | 关于磐岩 | 技术支持中心 | 联系我们 | 帮助中心 Copyright-2006 ComponentCN.com all rights reserved.重庆磐岩科技有限公司(控件中国网) 版权所有 电话:023 - 67870900 传真:023 - 67870270 产品咨询:sales@componentcn.com 渝ICP备12000264号 法律顾问:元炳律师事务所 重庆市江北区塔坪36号维丰创意绿苑A座28-5 邮编:400020
在线客服
在线客服系统
在线客服
在线客服系统