龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C#开发 >

C#委托的同步调用和异步调用

时间:2011-04-12 23:18来源:未知 作者:admin 点击:
分享到:
对于C#委托我们谈的比较多,在此谈论的是C#委托中的同步调用和异步调用,希望本文的实例能给大家平时的工作有所帮助。 C#委托的Invoke方法用来进行同步调用。同步调用也可以叫阻塞

对于C#委托我们谈的比较多,在此谈论的是C#委托中的同步调用和异步调用,希望本文的实例能给大家平时的工作有所帮助。

C#委托的Invoke方法用来进行同步调用。同步调用也可以叫阻塞调用,它将阻塞当前线程,然后执行调用,调用完毕后再继续向下进行。

同步调用的例子:

  1. using System;  
  2. using System.Threading;  
  3. public delegate int AddHandler(int a, int b);  
  4.  
  5. public class Foo {  
  6.  static void Main() {  
  7.   Console.WriteLine("**********SyncInvokeTest**************");  
  8.   AddHandler handler = new AddHandler(Add);  
  9.   int result = handler.Invoke(1,2);  
  10.   Console.WriteLine("Do other work... ... ...");  
  11.   Console.WriteLine(result);  
  12.   Console.ReadLine();  
  13.  }  
  14.    
  15.  static int Add(int a, int b) {  
  16.   Console.WriteLine("Computing "+a+" + "+b+" ...");  
  17.   Thread.Sleep(3000);  
  18.   Console.WriteLine("Computing Complete.");  
  19.   return a+b;  
  20.  }  

运行结果:

  1. **********SyncInvokeTest**************  
  2. Computing 1 + 2 ...  
  3. Computing Complete.  
  4. Do other work... ... ...  

同步调用会阻塞线程,如果是要调用一项繁重的工作(如大量IO操作),可能会让程序停顿很长时间,造成糟糕的用户体验,这时候异步调用就很有必要了。异步调用不阻塞线程,而是把调用塞到线程池中,程序主线程或UI线程可以继续执行。委托的异步调用通过BeginInvoke和EndInvoke来实现。

异步调用:

  1. using System;  
  2. using System.Threading;  
  3.  
  4. public delegate int AddHandler(int a, int b);  
  5.  
  6. public class Foo {  
  7.  static void Main() {  
  8.   Console.WriteLine("**********AsyncInvokeTest**************");  
  9.   AddHandler handler = new AddHandler(Add);  
  10.   IAsyncResult result = handler.BeginInvoke(1,2,null,null);  
  11.   Console.WriteLine("Do other work... ... ...");  
  12.   Console.WriteLine(handler.EndInvoke(result));  
  13.   Console.ReadLine();  
  14.  }  
  15.    
  16.  static int Add(int a, int b) {  
  17.   Console.WriteLine("Computing "+a+" + "+b+" ...");  
  18.   Thread.Sleep(3000);  
  19.   Console.WriteLine("Computing Complete.");  
  20.   return a+b;  
  21.  }  

运行结果:

  1.  **********AsyncInvokeTest**************  
  2. Do other work... ... ...  
  3. Computing 1 + 2 ...  
  4. Computing Complete.  
  5. 3   


可以看到,主线程并没有等待,而是直接向下运行了。

但是问题依然存在,当主线程运行到EndInvoke时,如果这时调用没有结束(这种情况很可能出现),这时为了等待调用结果,线程依旧会被阻塞。

解决的办法是用回调函数,当调用结束时会自动调用回调函数

回调异步:

  1. public class Foo {  
  2.  static void Main() {  
  3.   Console.WriteLine("**********AsyncInvokeTest**************");  
  4.   AddHandler handler = new AddHandler(Add);  
  5.   IAsyncResult result = handler.BeginInvoke(1,2,new AsyncCallback(AddComplete),"AsycState:OK");  
  6.   Console.WriteLine("Do other work... ... ...");  
  7.   Console.ReadLine();  
  8.  }  
  9.    
  10.  static int Add(int a, int b) {  
  11.   Console.WriteLine("Computing "+a+" + "+b+" ...");  
  12.   Thread.Sleep(3000);  
  13.   Console.WriteLine("Computing Complete.");  
  14.   return a+b;  
  15.  }  
  16.    
  17.  static void AddComplete(IAsyncResult result) {  
  18.   AddHandler handler = (AddHandler)((AsyncResult)result).AsyncDelegate;  
  19.   Console.WriteLine(handler.EndInvoke(result));  
  20.   Console.WriteLine(result.AsyncState);  
  21.  }  

原文标题:C#委托的同步调用和异步调用

链接:http://www.cnblogs.com/yinhu435/archive/2009/10/19/1585958.html


精彩图集

赞助商链接