自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

C#委托的同步調(diào)用和異步調(diào)用

開發(fā) 后端
我們這里將介紹的是C#委托的同步調(diào)用和異步調(diào)用,希望本文能對(duì)大家了解委托有所幫助。

對(duì)于C#委托我們談的比較多,在此談?wù)摰氖荂#委托中的同步調(diào)用和異步調(diào)用,希望本文的實(shí)例能給大家平時(shí)的工作有所幫助。

C#委托的Invoke方法用來進(jìn)行同步調(diào)用。同步調(diào)用也可以叫阻塞調(diào)用,它將阻塞當(dāng)前線程,然后執(zhí)行調(diào)用,調(diào)用完畢后再繼續(xù)向下進(jìn)行。

同步調(diào)用的例子:

  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.  }  

運(yùn)行結(jié)果:

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

同步調(diào)用會(huì)阻塞線程,如果是要調(diào)用一項(xiàng)繁重的工作(如大量IO操作),可能會(huì)讓程序停頓很長時(shí)間,造成糟糕的用戶體驗(yàn),這時(shí)候異步調(diào)用就很有必要了。異步調(diào)用不阻塞線程,而是把調(diào)用塞到線程池中,程序主線程或UI線程可以繼續(xù)執(zhí)行。委托的異步調(diào)用通過BeginInvoke和EndInvoke來實(shí)現(xiàn)。

異步調(diào)用:

  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.  }  

運(yùn)行結(jié)果:

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


可以看到,主線程并沒有等待,而是直接向下運(yùn)行了。

但是問題依然存在,當(dāng)主線程運(yùn)行到EndInvoke時(shí),如果這時(shí)調(diào)用沒有結(jié)束(這種情況很可能出現(xiàn)),這時(shí)為了等待調(diào)用結(jié)果,線程依舊會(huì)被阻塞。

解決的辦法是用回調(diào)函數(shù),當(dāng)調(diào)用結(jié)束時(shí)會(huì)自動(dòng)調(diào)用回調(diào)函數(shù)

回調(diào)異步:

  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.  }  

原文標(biāo)題:C#委托的同步調(diào)用和異步調(diào)用

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

【編輯推薦】

  1. C#數(shù)組基礎(chǔ)介紹與操作詳解
  2. 淺析C#數(shù)組初始化性能測試
  3. C#數(shù)組操作詳細(xì)剖析
  4. 淺析C#數(shù)組操作方法
  5. C#數(shù)組和串操作經(jīng)驗(yàn)總結(jié)
責(zé)任編輯:彭凡 來源: 博客園
相關(guān)推薦

2009-08-21 11:24:16

C#異步調(diào)用

2009-08-21 11:02:55

C#異步調(diào)用

2009-08-20 19:08:30

C#異步調(diào)用

2009-08-21 13:18:25

C#異步調(diào)用

2009-12-21 14:10:26

WCF異步調(diào)用

2009-11-09 10:50:30

WCF異步調(diào)用

2009-07-01 14:31:01

JavaScript異

2009-07-01 13:58:00

JavaScript異

2009-07-01 14:23:46

JavaScript異

2009-07-01 14:37:14

JavaScript異

2021-01-28 11:40:34

Dubbo異步配置

2009-11-06 15:54:15

WCF異步調(diào)用

2009-08-17 16:49:46

C#多線程控制

2021-03-29 09:26:44

SpringBoot異步調(diào)用@Async

2009-07-01 14:05:23

JavaScript異

2010-02-22 13:28:05

WCF異步調(diào)用

2012-10-29 10:59:27

Windows 8

2009-12-07 14:26:47

WCF異步調(diào)用

2011-03-02 08:57:22

jQueryJavaScript

2009-12-07 14:35:42

WCF異步調(diào)用
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)