国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

C#異步調用四大方法詳解

開發 后端
C#異步調用四大方法是什么呢?他們各自的作用是什么呢?那么本文就向你介紹C#異步調用四大方法的具體內容。

C#異步調用四大方法是什么呢?C#異步調用四大方法的使用是如何進行的呢?讓我們首先了解下什么時候用到C#異步調用:

.NET Framework 允許您C#異步調用任何方法。定義與您需要調用的方法具有相同簽名的委托;公共語言運行庫將自動為該委托定義具有適當簽名的 BeginInvoke 和 EndInvoke 方法。

BeginInvoke 方法用于啟動C#異步調用。它與您需要異步執行的方法具有相同的參數,只不過還有兩個額外的參數(將在稍后描述)。BeginInvoke 立即返回,不等待C#異步調用完成。BeginInvoke 返回 IasyncResult,可用于監視調用進度。

EndInvoke 方法用于檢索C#異步調用結果。調用 BeginInvoke 后可隨時調用 EndInvoke 方法;如果C#異步調用未完成,EndInvoke 將一直阻塞到C#異步調用完成。EndInvoke 的參數包括您需要異步執行的方法的 out 和 ref 參數(在 Visual Basic 中為 ByRef 和 ByRef)以及由 BeginInvoke 返回的 IAsyncResult。

注意   Visual Studio .NET 中的智能感知功能會顯示 BeginInvoke 和 EndInvoke 的參數。如果您沒有使用 Visual Studio 或類似的工具,或者您使用的是 C# 和 Visual Studio .NET,請參見異步方法簽名獲取有關運行庫為這些方法定義的參數的描述。

本主題中的代碼演示了四種使用 BeginInvoke 和 EndInvoke 進行C#異步調用的常用方法。調用了 BeginInvoke 后,可以:

· 進行某些操作,然后調用 EndInvoke 一直阻塞到調用完成。

· 使用 IAsyncResult.AsyncWaitHandle 獲取 WaitHandle,使用它的 WaitOne 方法將執行一直阻塞到發出 WaitHandle 信號,然后調用 EndInvoke。

· 輪詢由 BeginInvoke 返回的 IAsyncResult,確定C#異步調用何時完成,然后調用 EndInvoke。

· 將用于回調方法的委托傳遞給 BeginInvoke。該方法在C#異步調用完成后在 ThreadPool 線程上執行,它可以調用 EndInvoke。

警告:始終在C#異步調用完成后調用 EndInvoke。

測試方法和異步委托

四個示例全部使用同一個長期運行的測試方法 TestMethod。該方法顯示一個表明它已開始處理的控制臺信息,休眠幾秒鐘,然后結束。TestMethod 有一個 out 參數(在 Visual Basic 中為 ByRef),它演示了如何將這些參數添加到 BeginInvoke 和 EndInvoke 的簽名中。您可以用類似的方式處理 ref 參數(在 Visual Basic 中為 ByRef)。

下面的代碼示例顯示 TestMethod 以及代表 TestMethod 的委托;若要使用任一示例,請將示例代碼追加到這段代碼中。

注意   為了簡化這些示例,TestMethod 在獨立于 Main() 的類中聲明。或者,TestMethod 可以是包含 Main() 的同一類中的 static 方法(在 Visual Basic 中為 Shared)。

  1. using System;  
  2. using System.Threading;   
  3.  
  4. public class AsyncDemo {  
  5. // The method to be executed asynchronously.  
  6. //  
  7. public string TestMethod(  
  8. int callDuration, out int threadId) {  
  9. Console.WriteLine("Test method begins.");  
  10. Thread.Sleep(callDuration);  
  11. threadId = AppDomain.GetCurrentThreadId();  
  12. return "MyCallTime was " + callDuration.ToString();  
  13. }  
  14. }  
  15.  
  16. // The delegate must have the same signature as the method  
  17. // you want to call asynchronously.  
  18. public delegate string AsyncDelegate(  
  19. int callDuration, out int threadId);  
  20.    
  21.  
  22. using System;  
  23. using System.Threading;   
  24.  
  25. public class AsyncDemo {  
  26. // The method to be executed asynchronously.  
  27. //  
  28. public string TestMethod(  
  29. int callDuration, out int threadId) {  
  30. Console.WriteLine("Test method begins.");  
  31. Thread.Sleep(callDuration);  
  32. threadId = AppDomain.GetCurrentThreadId();  
  33. return "MyCallTime was " + callDuration.ToString();  
  34. }  
  35. }  
  36.  
  37. // The delegate must have the same signature as the method  
  38. // you want to call asynchronously.  
  39. public delegate string AsyncDelegate(  
  40. int callDuration, out int threadId); 

C#異步調用四大方法之使用 EndInvoke 等待異步調用

異步執行方法的最簡單方式是以 BeginInvoke 開始,對主線程執行一些操作,然后調用 EndInvoke。EndInvoke 直到C#異步調用完成后才返回。這種技術非常適合文件或網絡操作,但是由于它阻塞 EndInvoke,所以不要從用戶界面的服務線程中使用它。

  1. public class AsyncMain {  
  2. static void Main(string[] args) {  
  3. // The asynchronous method puts the thread id here.  
  4. int threadId;  
  5.  
  6. // Create an instance of the test class.  
  7. AsyncDemo ad = new AsyncDemo();  
  8.  
  9. // Create the delegate.  
  10. AsyncDelegate dlgt = new AsyncDelegate(ad.TestMethod);  
  11.      
  12. // Initiate the asychronous call.  
  13. IAsyncResult ar = dlgt.BeginInvoke(3000,   
  14. out threadId, nullnull);  
  15.  
  16. Thread.Sleep(0);  
  17. Console.WriteLine("Main thread {0} does some work.",  
  18. AppDomain.GetCurrentThreadId());  
  19.  
  20. // Call EndInvoke to Wait for   
  21. //the asynchronous call to complete,  
  22. // and to retrieve the results.  
  23. string ret = dlgt.EndInvoke(out threadId, ar);  
  24.  
  25. Console.WriteLine("The call executed on thread {0},   
  26. with return value \"{1}\".", threadId, ret);  
  27. }  

C#異步調用四大方法之使用 WaitHandle 等待異步調用

等待 WaitHandle 是一項常用的線程同步技術。您可以使用由 BeginInvoke 返回的 IAsyncResult 的 AsyncWaitHandle 屬性來獲取 WaitHandle。C#異步調用完成時會發出 WaitHandle 信號,而您可以通過調用它的 WaitOne 等待它。

如果您使用 WaitHandle,則在C#異步調用完成之后,但在通過調用 EndInvoke 檢索結果之前,可以執行其他處理。

  1. public class AsyncMain {  
  2. static void Main(string[] args) {  
  3. // The asynchronous method puts the thread id here.  
  4. int threadId;  
  5.  
  6. // Create an instance of the test class.  
  7. AsyncDemo ad = new AsyncDemo();  
  8.  
  9. // Create the delegate.  
  10. AsyncDelegate dlgt = new AsyncDelegate(ad.TestMethod);  
  11.      
  12. // Initiate the asychronous call.  
  13. IAsyncResult ar = dlgt.BeginInvoke(3000,   
  14. out threadId, nullnull);  
  15.  
  16. Thread.Sleep(0);  
  17. Console.WriteLine("Main thread {0} does some work.",  
  18. AppDomain.GetCurrentThreadId());  
  19.  
  20. // Wait for the WaitHandle to become signaled.  
  21. ar.AsyncWaitHandle.WaitOne();  
  22.  
  23. // Perform additional processing here.  
  24. // Call EndInvoke to retrieve the results.  
  25. string ret = dlgt.EndInvoke(out threadId, ar);  
  26.  
  27. Console.WriteLine("The call executed on thread {0},   
  28. with return value \"{1}\".", threadId, ret);  
  29. }  

C#異步調用四大方法之輪詢異步調用完成

您可以使用由 BeginInvoke 返回的 IAsyncResult 的 IsCompleted 屬性來發現C#異步調用何時完成。從用戶界面的服務線程中進行C#異步調用時可以執行此操作。輪詢完成允許用戶界面線程繼續處理用戶輸入。

  1. public class AsyncMain {  
  2. static void Main(string[] args) {  
  3. // The asynchronous method puts the thread id here.  
  4. int threadId;  
  5.  
  6. // Create an instance of the test class.  
  7. AsyncDemo ad = new AsyncDemo();  
  8.  
  9. // Create the delegate.  
  10. AsyncDelegate dlgt = new AsyncDelegate(ad.TestMethod);  
  11.      
  12. // Initiate the asychronous call.  
  13. IAsyncResult ar = dlgt.BeginInvoke(3000,   
  14. out threadId, nullnull);  
  15.  
  16. // Poll while simulating work.  
  17. while(ar.IsCompleted == false) {  
  18. Thread.Sleep(10);  
  19. }  
  20.  
  21. // Call EndInvoke to retrieve the results.  
  22. string ret = dlgt.EndInvoke(out threadId, ar);  
  23.  
  24. Console.WriteLine("The call executed on thread {0},  
  25.  with return value \"{1}\".", threadId, ret);  
  26. }  

C#異步調用四大方法之異步調用完成時執行回調方法

如果啟動異步調用的線程不需要處理調用結果,則可以在調用完成時執行回調方法。回調方法在 ThreadPool 線程上執行。

要使用回調方法,必須將代表該方法的 AsyncCallback 委托傳遞給 BeginInvoke。也可以傳遞包含回調方法將要使用的信息的對象。例如,可以傳遞啟動調用時曾使用的委托,以便回調方法能夠調用 EndInvoke。

  1. public class AsyncMain {  
  2. // Asynchronous method puts the thread id here.  
  3. private static int threadId;  
  4.  
  5. static void Main(string[] args) {  
  6. // Create an instance of the test class.  
  7. AsyncDemo ad = new AsyncDemo();  
  8.  
  9. // Create the delegate.  
  10. AsyncDelegate dlgt = new AsyncDelegate(ad.TestMethod);  
  11.      
  12. // Initiate the asychronous call.  Include an AsyncCallback  
  13. // delegate representing the callback method, and the data  
  14. // needed to call EndInvoke.  
  15. IAsyncResult ar = dlgt.BeginInvoke(3000,  
  16. out threadId,   
  17. new AsyncCallback(CallbackMethod),  
  18. dlgt );  
  19.  
  20. Console.WriteLine("Press Enter to close application.");  
  21. Console.ReadLine();  
  22. }  
  23.  
  24. // Callback method must have the same signature as the  
  25. // AsyncCallback delegate.  
  26. static void CallbackMethod(IAsyncResult ar) {  
  27. // Retrieve the delegate.  
  28. AsyncDelegate dlgt = (AsyncDelegate) ar.AsyncState;  
  29.  
  30. // Call EndInvoke to retrieve the results.  
  31. string ret = dlgt.EndInvoke(out threadId, ar);  
  32.  
  33. Console.WriteLine("The call executed on thread {0},  
  34.  with return value \"{1}\".", threadId, ret);  
  35. }  
  36. }  

C#異步調用四大方法的基本內容就向你介紹到這里,希望對你了解和學習C#異步調用有所幫助。

【編輯推薦】

  1. FlyTcpFramework在C#異步中的應用
  2. C#異步調用的應用實踐淺談
  3. 委托實現C#異步調用淺析
  4. 淺析C#中異步和多線程的區別
  5. C# Socket通信三大問題詳解
責任編輯:仲衡 來源: 博客園
相關推薦

2009-10-20 16:48:30

C#委托

2009-08-21 11:24:16

C#異步調用

2009-08-21 11:02:55

C#異步調用

2009-08-20 19:08:30

C#異步調用

2009-08-28 11:43:26

C#數組初始化

2021-08-13 09:55:42

數據中心功耗IT支出

2021-07-30 17:47:46

數據中心電力能源

2009-08-21 10:17:14

C#異步網絡編程

2009-08-17 08:01:00

C#文件列表

2011-11-14 09:58:33

2021-10-21 08:49:36

物聯網市場物聯網IOT

2009-11-06 15:54:15

WCF異步調用

2010-01-11 17:24:19

VB.NET異步調用

2021-03-29 09:26:44

SpringBoot異步調用@Async

2009-07-23 13:47:46

ASP.NET數據緩存

2009-09-01 09:37:15

C#寫文件

2020-11-13 09:02:35

CIOGartner

2009-01-11 10:25:00

局域網共享上網

2009-09-02 10:49:46

C#調用析構方法

2009-08-17 16:49:46

C#多線程控制
點贊
收藏

51CTO技術棧公眾號

在线电影一区| 亚洲高清免费观看高清完整版在线观看 | 天堂av资源在线观看| 亚洲综合久久av| 男操女免费网站| 久久精品99国产精品日本| www日韩av| 欧美国产综合| 国产成人精品自拍| 国模吧视频一区| 精品欧美一区二区久久久伦| 在线免费观看欧美| 免费h精品视频在线播放| 国产一区二区三区的电影 | 亚洲三区在线| 久久久久久色| 色婷婷精品国产一区二区三区| 国产欧美二区| 亚洲一区3d动漫同人无遮挡 | 日韩欧美国产免费播放| 亚洲欧美日本免费| 精品久久久久久| 四虎精品成人免费网站| 在线视频欧美精品| 在线免费看黄网站| 日韩午夜精品电影| av中文字幕在线看| 综合网日日天干夜夜久久| 国产精久久久| 欧美激情视频一区二区三区不卡| 色狼人综合干| 亚洲字幕一区二区| 热久久国产精品| 日韩国产一级片| 国产精品免费免费| 污视频在线观看网站| 91精品国产入口| 三级中文字幕在线观看| 久久亚洲成人精品| 九九久久成人| 久久精品国产美女| av午夜精品一区二区三区| metart日本精品嫩模| 色偷偷久久人人79超碰人人澡| 91精品国产91久久久久游泳池| 精品久久久久久久人人人人传媒| av免费在线一区| 日韩美女主播视频| 亚洲一区二区成人| a级黄色一级片| 欧美日韩亚洲91| 波多野结衣亚洲| 欧美最顶级的aⅴ艳星| 亚洲经典自拍| 国产二区视频在线| 欧美性xxxx| 视频一区在线免费看| 国产91色在线免费| 肉丝袜脚交视频一区二区| 91淫黄看大片| 欧美日韩免费一区二区三区| 91p九色成人| 国产精品美女久久久久av超清| 视频一区中文字幕| 99re免费99re在线视频手机版| 欧美图区在线视频| 日韩精品一区国产| 久久99精品久久久久久青青日本| 成人va在线观看| 久草在线网址| 欧美成人合集magnet| 99精品久久| www成人免费观看网站| 欧美一区二区三区视频在线| 极品束缚调教一区二区网站 | 激情文学一区| 国产精品-区区久久久狼| 色婷婷激情久久| 国产精品一区免费在线| 国产精品对白一区二区三区| eeuss国产一区二区三区| 国模精品一区二区| 午夜精品蜜臀一区二区三区免费 | 日本欧洲国产一区二区| 亚洲视频每日更新| 蜜臀久久精品| 91久久精品一区| 久久综合成人精品亚洲另类欧美 | 免费观看一二区视频网站| 日韩精品极品视频免费观看| 国产精品精品| 国产成人精品无码播放| 欧美精品一区二区三区四区| 国产精品毛片久久| 国产 porn| 三级精品视频久久久久| 欧美综合二区| 国产高清自拍视频在线观看| 日韩av免费看| 久久综合久久99| 高清在线视频不卡| 国产精品一区二区免费| 琪琪第一精品导航| 天天爽天天爽夜夜爽| 99久久精品久久久久久清纯| 色综合电影网| 日韩av一区二区在线影视| 成人动漫av| 就去色蜜桃综合| 精品日韩欧美在线| wwww国产精品欧美| 91福利在线尤物| 艳母动漫在线免费观看| 欧美在线观看网站| 91国内精品野花午夜精品| 欧美午夜影院| 色综合综合色| 亚洲久久久久| 新欧美整片sss第一页| 日日橹狠狠爱欧美超碰| 91久久久久久久久久久| 久久久精品一区二区| 制服丝袜在线91| 亚洲欧美综合在线精品| 日韩欧美在线观看| 欧美一个色资源| 粉嫩高潮美女一区二区三区| 欧洲专线二区三区| 亚洲三级网页| www.日韩| 欧美精品videos另类| av在线天堂播放| 黄色av观看| 大桥未久一区二区| 好吊色欧美一区二区三区| 日av在线播放中文不卡| 国产一区二区三区久久精品| 另类亚洲自拍| 婷婷久久国产对白刺激五月99| 欧美午夜三级| 日韩av在线播放网址| 视频一区在线播放| 国产精品情趣视频| 亚洲人成精品久久久久| 国产乱人伦精品一区二区在线观看| 欧美日韩色一区| 国产91精品一区二区绿帽| 欧美日韩三级在线| 电影k8一区二区三区久久 | 吴梦梦av在线| 亚洲欧美福利视频| 99久久久久久| 久久97精品| 中文在线一二区| 国产精品久久久久久久久久直播| 在线观看欧美精品| 日本欧美一区二区在线观看| 中文字幕成在线观看| 国产真人做爰毛片视频直播| 蜜月aⅴ免费一区二区三区| 中文字幕视频一区二区三区久| 日韩国产欧美| 国产激情视频在线| 国产制服91一区二区三区制服| 欧美成年人在线观看| 五月激情六月综合| 日本亚洲三级在线| 久久视频社区| 欧美成人免费| 美女扒开大腿让男人桶| 日本精品久久久久影院| 欧美精品在线观看播放| 不卡一区二区在线| 色呦哟—国产精品| 性欧美18xxxhd| 爱爱免费视频网站| 热re99久久精品国99热蜜月| 日韩在线视频国产| 欧美视频第一页| 成人免费视频国产在线观看| 日韩黄色大片网站| 国产不卡123| 成人在线观看视频app| 国产又爽又黄ai换脸| 日产日韩在线亚洲欧美| 精品欧美乱码久久久久久1区2区 | 一区二区成人国产精品| 久久久免费精品视频| 欧美日韩精品高清| 91婷婷韩国欧美一区二区| 欧美激情欧美| 国产香蕉久久| 3p在线观看| 手机在线看福利| 六月婷婷久久| 欧美亚州一区二区三区| 日韩经典一区二区三区| 欧美日韩国产精品一区| 91小视频在线| 视频一区二区三区在线|