日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
C#異步方法和同步方法的差異淺談

C#異步方法和同步方法的差異是什么呢?

武穴網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)公司!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)公司從2013年創(chuàng)立到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專(zhuān)注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)公司。

C#同步方法調(diào)用在程序繼續(xù)執(zhí)行之前需要等待同步方法執(zhí)行完畢返回結(jié)果

C#異步方法則在被調(diào)用之后立即返回以便程序在被調(diào)用方法完成其任務(wù)的同時(shí)執(zhí)行其它操作

異步編程概覽

.NET Framework 允許您異步調(diào)用任何方法。定義與您需要調(diào)用的方法具有相同簽名的委托;公共語(yǔ)言運(yùn)行庫(kù)將自動(dòng)為該委托定義具有適當(dāng)簽名

的 BeginInvoke 和 EndInvoke 方法。

BeginInvoke 方法用于啟動(dòng)異步調(diào)用。它與您需要異步執(zhí)行的方法具有相同的參數(shù),只不過(guò)還有兩個(gè)額外的參數(shù)(將在稍后描述)。

BeginInvoke 立即返回,不等待異步調(diào)用完成。

BeginInvoke 返回 IasyncResult,可用于監(jiān)視調(diào)用進(jìn)度。

EndInvoke 方法用于檢索異步調(diào)用結(jié)果。調(diào)用BeginInvoke后可隨時(shí)調(diào)用EndInvoke方法;如果異步調(diào)用未完成,EndInvoke 將一直阻塞到

異步調(diào)用完成。EndInvoke的參數(shù)包括您需要異步執(zhí)行的方法的out和ref參數(shù)(在 Visual Basic 中為 ByRef 和 ByRef)以及由BeginInvoke 返回的IAsyncResult。

四種C#異步方法使用 BeginInvoke 和 EndInvoke 進(jìn)行異步調(diào)用。調(diào)用了BeginInvoke后,可以:

1.進(jìn)行某些操作,然后調(diào)用 EndInvoke 一直阻塞到調(diào)用完成。

2.使用 IAsyncResult.AsyncWaitHandle 獲取 WaitHandle,使用它的 WaitOne 方法將執(zhí)行一直阻塞到發(fā)出 WaitHandle 信號(hào),然后調(diào)用EndInvoke。這里主要是主程序等待異步方法,等待異步方法的結(jié)果。

3.輪詢由 BeginInvoke 返回的 IAsyncResult,IAsyncResult.IsCompeted確定異步調(diào)用何時(shí)完成,然后調(diào)用 EndInvoke。此處理個(gè)人認(rèn)為與相同。

4.將用于回調(diào)方法的委托傳遞給 BeginInvoke。該方法在異步調(diào)用完成后在 ThreadPool 線程上執(zhí)行,它可以調(diào)用 EndInvoke。這是在強(qiáng)制裝換回調(diào)函數(shù)里面IAsyncResult.AsyncState(BeginInvoke方法的最后一個(gè)參數(shù))成委托,然后用委托執(zhí)行EndInvoke。

警告   始終在異步調(diào)用完成后調(diào)用 EndInvoke。

以上有不理解的稍后可以再理解。

C#異步方法例子

1)先來(lái)個(gè)簡(jiǎn)單的沒(méi)有回調(diào)函數(shù)的異步方法例子

請(qǐng)?jiān)龠\(yùn)行程序的時(shí)候,仔細(xì)看注釋?zhuān)瑢?duì)理解很有幫助。還有,若將注釋的中的兩個(gè)方法都同步,你會(huì)發(fā)現(xiàn)異步運(yùn)行的速度優(yōu)越性。

 
 
 
  1. using System;  
  2.  namespace ConsoleApplication1  
  3.  {  
  4.  class Class1  
  5.  {  
  6.  //聲明委托  
  7.  public delegate void AsyncEventHandler();  
  8.    
  9.  //C#異步方法  
  10.  void Event1()  
  11. {  
  12. Console.WriteLine("Event1 Start");  
  13. System.Threading.Thread.Sleep(4000);  
  14. Console.WriteLine("Event1 End");  
  15. }  
  16. // C#同步方法  
  17. void Event2()  
  18. {  
  19. Console.WriteLine("Event2 Start");  
  20. int i=1;  
  21. while(i<1000)  
  22. {  
  23. i=i+1;  
  24. Console.WriteLine("Event2 "+i.ToString());  
  25. }  
  26. Console.WriteLine("Event2 End");  
  27. }  
  28. [STAThread]  
  29. static void Main(string[] args)  
  30. {  
  31. long start=0;  
  32. long end=0;  
  33. Class1 c = new Class1();  
  34. Console.WriteLine("ready");  
  35. start=DateTime.Now.Ticks;  
  36.  
  37. //實(shí)例委托  
  38. AsyncEventHandler asy = new AsyncEventHandler(c.Event1);  
  39. //C#異步方法:異步調(diào)用開(kāi)始,沒(méi)有回調(diào)函數(shù)和AsyncState,都為null  
  40. IAsyncResult ia = asy.BeginInvoke(null, null);  
  41. //C#同步方法:同步開(kāi)始,  
  42. c.Event2();  
  43. //異步結(jié)束,若沒(méi)有結(jié)束,一直阻塞到調(diào)用完成,在此返回該函數(shù)的return,若有返回值。   
  44. asy.EndInvoke(ia);  
  45.  
  46. //都同步的情況。  
  47. //c.Event1();  
  48. //c.Event2();  
  49.      
  50. end =DateTime.Now.Ticks;  
  51. Console.WriteLine("時(shí)間刻度差="+ Convert.ToString(end-start) );  
  52. Console.ReadLine();  
  53. }  
  54. }  

2)下面看有回調(diào)函數(shù)的WebRequest和WebResponse的異步操作。

 
 
 
  1. using System;  
  2. using System.Net;  
  3. using System.Threading;  
  4. using System.Text;  
  5. using System.IO;  
  6. // RequestState 類(lèi)用于通過(guò)  
  7. // 異步調(diào)用傳遞數(shù)據(jù)  
  8. public class RequestState  
  9. {  
  10. const int BUFFER_SIZE = 1024;  
  11. public StringBuilder RequestData;  
  12. public byte[] BufferRead;  
  13. public HttpWebRequest Request;  
  14. public Stream ResponseStream;  
  15. // 創(chuàng)建適當(dāng)編碼類(lèi)型的解碼器  
  16. public Decoder StreamDecode = Encoding.UTF8.GetDecoder();  
  17.  
  18. public RequestState()  
  19. {  
  20. BufferRead = new byte[BUFFER_SIZE];  
  21. RequestData = new StringBuilder("");  
  22. Request = null;  
  23. ResponseStream = null;  
  24. }  
  25. }  
  26. // ClientGetAsync 發(fā)出異步請(qǐng)求  
  27. class ClientGetAsync  
  28. {  
  29. public static ManualResetEvent allDone =   
  30. new ManualResetEvent(false);  
  31. const int BUFFER_SIZE = 1024;  
  32.  
  33. public static void Main(string[] args)  
  34. {  
  35. if (args.Length < 1)  
  36. {  
  37. showusage();  
  38. return;  
  39. }  
  40. // 從命令行獲取 URI  
  41. Uri HttpSite = new Uri(args[0]);  
  42.  
  43. // 創(chuàng)建請(qǐng)求對(duì)象  
  44. HttpWebRequest wreq = (HttpWebRequest)WebRequest.Create(HttpSite);  
  45.  
  46. // 創(chuàng)建狀態(tài)對(duì)象  
  47. RequestState rs = new RequestState();  
  48.  
  49. // 將請(qǐng)求添加到狀態(tài),以便它可以被來(lái)回傳遞  
  50. rs.Request = wreq;  
  51.  
  52. // 發(fā)出異步請(qǐng)求  
  53. IAsyncResult r = (IAsyncResult)wreq.BeginGetResponse(  
  54. new AsyncCallback(RespCallback), rs);  
  55.  
  56. // 將 ManualResetEvent 設(shè)置為 Wait,  
  57. // 以便在調(diào)用回調(diào)前,應(yīng)用程序不退出  
  58. allDone.WaitOne();  
  59. }  
  60. public static void showusage()  
  61. {  
  62. Console.WriteLine("嘗試獲取 (GET) 一個(gè) URL");  
  63. Console.WriteLine("\r\n用法::");  
  64. Console.WriteLine("ClientGetAsync URL");  
  65. Console.WriteLine("示例::");  
  66. Console.WriteLine("ClientGetAsync http://www.microsoft.com/net/");  
  67. }  
  68.  
  69. private static void RespCallback(IAsyncResult ar)  
  70. {  
  71. // 從異步結(jié)果獲取 RequestState 對(duì)象  
  72. RequestState rs = (RequestState)ar.AsyncState;  
  73.  
  74. // 從 RequestState 獲取 HttpWebRequest  
  75. HttpWebRequest req = rs.Request;  
  76.  
  77. // 調(diào)用 EndGetResponse 生成 HttpWebResponse 對(duì)象  
  78. // 該對(duì)象來(lái)自上面發(fā)出的請(qǐng)求  
  79. HttpWebResponse resp = (HttpWebResponse)req.EndGetResponse(ar);  
  80.  
  81. // 既然我們擁有了響應(yīng),就該從  
  82. // 響應(yīng)流開(kāi)始讀取數(shù)據(jù)了  
  83. Stream ResponseStream = resp.GetResponseStream();  
  84.  
  85. // 該讀取操作也使用異步完成,所以我們  
  86. // 將要以 RequestState 存儲(chǔ)流  
  87. rs.ResponseStream = ResponseStream;  
  88.  
  89. // 請(qǐng)注意,rs.BufferRead 被傳入到 BeginRead。  
  90. // 這是數(shù)據(jù)將被讀入的位置。  
  91. IAsyncResult iarRead = ResponseStream.BeginRead(  
  92. rs.BufferRead, 0, BUFFER_SIZE,   
  93. new AsyncCallback(ReadCallBack), rs);  
  94. }  
  95. private static void ReadCallBack(IAsyncResult asyncResult)  
  96. {  
  97. // 從 asyncresult 獲取 RequestState 對(duì)象  
  98. RequestState rs = (RequestState)asyncResult.AsyncState;  
  99.  
  100. // 取出在 RespCallback 中設(shè)置的 ResponseStream  
  101. Stream responseStream = rs.ResponseStream;  
  102.  
  103. // 此時(shí) rs.BufferRead 中應(yīng)該有一些數(shù)據(jù)。  
  104. // 讀取操作將告訴我們那里是否有數(shù)據(jù)  
  105. int read = responseStream.EndRead(asyncResult);  
  106.  
  107. if (read > 0)  
  108. {  
  109. // 準(zhǔn)備 Char 數(shù)組緩沖區(qū),用于向 Unicode 轉(zhuǎn)換  
  110. Char[] charBuffer = new Char[BUFFER_SIZE];  
  111.  
  112. // 將字節(jié)流轉(zhuǎn)換為 Char 數(shù)組,然后轉(zhuǎn)換為字符串  
  113. // len 顯示多少字符被轉(zhuǎn)換為 Unicode  
  114. int len = rs.StreamDecode.GetChars(  
  115. rs.BufferRead, 0, read, charBuffer, 0);  
  116. String str = new String(charBuffer, 0, len);  
  117.  
  118. // 將最近讀取的數(shù)據(jù)追加到 RequestData stringbuilder 對(duì)象中,  
  119. // 該對(duì)象包含在 RequestState 中  
  120. rs.RequestData.Append(str);  
  121.  
  122.  
  123. // 現(xiàn)在發(fā)出另一個(gè)異步調(diào)用,讀取更多的數(shù)據(jù)  
  124. // 請(qǐng)注意,將不斷調(diào)用此過(guò)程,直到  
  125. // responseStream.EndRead 返回 -1  
  126. IAsyncResult ar = responseStream.BeginRead(  
  127. rs.BufferRead, 0, BUFFER_SIZE,   
  128. new AsyncCallback(ReadCallBack), rs);  
  129. }  
  130. else 
  131. {  
  132. if (rs.RequestData.Length > 1)  
  133. {  
  134. // 所有數(shù)據(jù)都已被讀取,因此將其顯示到控制臺(tái)  
  135. string strContent;  
  136. strContent = rs.RequestData.ToString();  
  137. Console.WriteLine(strContent);  
  138. }  
  139.  
  140. // 關(guān)閉響應(yīng)流  
  141. responseStream.Close();  
  142.  
  143. // 設(shè)置 ManualResetEvent,以便主線程可以退出  
  144. allDone.Set();  
  145. }  
  146. return;  
  147. }  

在這里有回調(diào)函數(shù),且異步回調(diào)中又有異步操作。

首先是異步獲得ResponseStream,然后異步讀取數(shù)據(jù)。

這個(gè)程序非常經(jīng)典。從中可以學(xué)到很多東西的。我們來(lái)共同探討。

C#異步方法和同步方法的差異總結(jié)

上面說(shuō)過(guò),.net framework 可以異步調(diào)用任何方法。所以異步用處廣泛。

在.net framework 類(lèi)庫(kù)中也有很多異步調(diào)用的方法。一般都是已Begin開(kāi)頭End結(jié)尾構(gòu)成一對(duì),異步委托方法,外加兩個(gè)回調(diào)函數(shù)和AsyncState參數(shù),組成異步操作的宏觀體現(xiàn)。所以要做異步編程,不要忘了委托delegate、Begin,End,AsyncCallBack委托,AsyncState實(shí)例(在回調(diào)函數(shù)中通過(guò)IAsyncResult.AsyncState來(lái)強(qiáng)制轉(zhuǎn)換),IAsycResult(監(jiān)控異步),就足以理解異步真諦了。

C#異步方法和同步方法的差異的基本內(nèi)容就向你介紹到這里,希望對(duì)你了解和學(xué)習(xí)C#異步方法和同步方法的差異有所幫助。


文章題目:C#異步方法和同步方法的差異淺談
鏈接地址:http://m.5511xx.com/article/cdgshcs.html