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

开发 后端
我们这里将介绍的是C#委托的同步调用和异步调用,希望本文能对大家了解委托有所帮助。

对于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

【编辑推荐】

  1. C#数组基础介绍与操作详解
  2. 浅析C#数组初始化性能测试
  3. C#数组操作详细剖析
  4. 浅析C#数组操作方法
  5. C#数组和串操作经验总结
责任编辑:彭凡 来源: 博客园
相关推荐

2009-08-21 11:24:16

C#异步调用

2009-08-21 11:02:55

C#异步调用

2009-08-20 19:08:30

C#异步调用

2009-08-21 13:18:25

C#异步调用

2009-12-21 14:10:26

WCF异步调用

2009-11-09 10:50:30

WCF异步调用

2009-07-01 14:31:01

JavaScript异

2009-07-01 13:58:00

JavaScript异

2009-07-01 14:37:14

JavaScript异

2009-07-01 14:23:46

JavaScript异

2009-11-06 15:54:15

WCF异步调用

2021-01-28 11:40:34

Dubbo异步配置

2021-03-29 09:26:44

SpringBoot异步调用@Async

2009-08-17 16:49:46

C#多线程控制

2010-02-22 13:28:05

WCF异步调用

2009-07-01 14:05:23

JavaScript异

2009-12-07 14:26:47

WCF异步调用

2009-12-07 14:35:42

WCF异步调用

2011-03-02 08:57:22

jQueryJavaScript

2010-01-11 17:24:19

VB.NET异步调用
点赞
收藏

51CTO技术栈公众号