精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

異步編程:基于事件的異步編程模式(EMP)

開發(fā) 后端
對于相對簡單的多線程應(yīng)用程序,BackgroundWorker組件提供了一個簡單的解決方案。對于更復(fù)雜的異步應(yīng)用程序,可以考慮實現(xiàn)一個符合基于事件的異步模式的類。

上一篇,我給大家介紹了“.NET1.0中基于IAsyncResult設(shè)計模式的異步編程模型(APM)”,它使用System.Threading命名空間的類來構(gòu)造多線程應(yīng)用程序。然而要想有效地使用這些工具類,需要有豐富的使用多線程軟件工程的經(jīng)驗。對于相對簡單的多線程應(yīng)用程序,BackgroundWorker組件提供了一個簡單的解決方案。對于更復(fù)雜的異步應(yīng)用程序,可以考慮實現(xiàn)一個符合基于事件的異步模式的類。

使用支持此模式的類,您將能夠:

1) 異步執(zhí)行耗時的任務(wù)。

2) 獲得進度報告和增量結(jié)果。

3) 支持耗時任務(wù)的取消。

4) 獲得任務(wù)的結(jié)果值或異常信息。

5) 更復(fù)雜:支持同時執(zhí)行多個異步操作、進度報告、增量結(jié)果、取消操作、返回結(jié)果值或異常信息。

 

 

源碼下載:異步編程:基于事件的異步模型(EAP).rar

 

為了實現(xiàn)基于事件的異步模式,我們必須先理解兩個重要的幫助器類:

 

AsyncOperationManager和AsyncOperation

AsyncOperationManager類和AsyncOperation類是System.ComponentModel命名空間為我們提供了兩個重要幫助器類。在基于事件的異步模式封裝標(biāo)準(zhǔn)化的異步功能中,它確保你的異步操作支持在各種應(yīng)用程序模型(包括 ASP.NET、控制臺應(yīng)用程序和 Windows 窗體應(yīng)用程序)的適當(dāng)“線程或上下文”調(diào)用客戶端事件處理程序。

AsyncOperationManager類和AsyncOperation類的API如下:

  1. // 為支持異步方法調(diào)用的類提供并發(fā)管理。此類不能被繼承。  
  2. public static class AsyncOperationManager  
  3. {  
  4.     // 獲取或設(shè)置用于異步操作的同步上下文。  
  5.     public static SynchronizationContext SynchronizationContext { get; set; }  
  6.    
  7.     // 返回可用于對特定異步操作的持續(xù)時間進行跟蹤的AsyncOperation對象。  
  8.     // 參數(shù):userSuppliedState:  
  9.     //     一個對象,用于使一個客戶端狀態(tài)(如任務(wù) ID)與一個特定異步操作相關(guān)聯(lián)。  
  10.     public static AsyncOperation CreateOperation(object userSuppliedState)  
  11.     {  
  12.         return AsyncOperation.CreateOperation(userSuppliedState,SynchronizationContext);  
  13.     }  
  14. }  
  15.    
  16. // 跟蹤異步操作的生存期。  
  17. public sealed class AsyncOperation  
  18. {  
  19.     // 構(gòu)造函數(shù)  
  20.     private AsyncOperation(object userSuppliedState, SynchronizationContext syncContext);  
  21.     internal static AsyncOperation CreateOperation(object userSuppliedState  
  22.                                             , SynchronizationContext syncContext);  
  23.    
  24.     // 獲取傳遞給構(gòu)造函數(shù)的SynchronizationContext對象。  
  25.     public SynchronizationContext SynchronizationContext { get; }  
  26.     // 獲取或設(shè)置用于唯一標(biāo)識異步操作的對象。  
  27.     public object UserSuppliedState { get; }  
  28.    
  29.     // 在各種應(yīng)用程序模型適合的線程或上下文中調(diào)用委托。  
  30.     public void Post(SendOrPostCallback d, object arg);  
  31.     // 結(jié)束異步操作的生存期。  
  32.     public void OperationCompleted();  
  33.     // 效果同調(diào)用 Post() + OperationCompleted() 方法組合  
  34.     public void PostOperationCompleted(SendOrPostCallback d, object arg);  

先分析下這兩個幫助器類:

1. AsyncOperationManager是靜態(tài)類。靜態(tài)類是密封的,因此不可被繼承。倘若從靜態(tài)類繼承會報錯“靜態(tài)類必須從 Object 派生”。(小常識,以前以為密封類就是 sealed 關(guān)鍵字)

2. AsyncOperationManager為支持異步方法調(diào)用的類提供并發(fā)管理,該類可正常運行于 .NET Framework 支持的所有應(yīng)用程序模式下。

3. AsyncOperation實例提供對特定異步任務(wù)的生存期進行跟蹤。可用來處理任務(wù)完成通知,還可用于在不終止異步操作的情況下發(fā)布進度報告和增量結(jié)果(這種不終止異步操作的處理是通過AsyncOperation的 Post() 方法實現(xiàn))。

4. AsyncOperation類有一個私有的構(gòu)造函數(shù)和一個內(nèi)部CreateOperation() 靜態(tài)方法。由AsyncOperationManager類調(diào)用AsyncOperation.CreateOperation() 靜態(tài)方法來創(chuàng)建AsyncOperation實例。

5. AsyncOperation類是通過SynchronizationContext類來實現(xiàn)在各種應(yīng)用程序的適當(dāng)“線程或上下文”調(diào)用客戶端事件處理程序。

  1. // 提供在各種同步模型中傳播同步上下文的基本功能。  
  2. public class SynchronizationContext  
  3. {  
  4.     // 獲取當(dāng)前線程的同步上下文。  
  5.     public static SynchronizationContext Current { get; }  
  6.    
  7.     // 當(dāng)在派生類中重寫時,響應(yīng)操作已開始的通知。  
  8.     public virtual void OperationStarted();  
  9.     // 當(dāng)在派生類中重寫時,將異步消息調(diào)度到一個同步上下文。  
  10.     public virtual void Post(SendOrPostCallback d, object state);  
  11.     // 當(dāng)在派生類中重寫時,響應(yīng)操作已完成的通知。  
  12.     public virtual void OperationCompleted();  
  13.     ……  

a) 在AsyncOperation構(gòu)造函數(shù)中調(diào)用SynchronizationContext的OperationStarted() ;

b) 在AsyncOperation的 Post() 方法中調(diào)用SynchronizationContext的Post() ;

c) 在AsyncOperation的OperationCompleted()方法中調(diào)用SynchronizationContext的OperationCompleted();

6. SendOrPostCallback委托簽名:

  1. // 表示在消息即將被調(diào)度到同步上下文時要調(diào)用的方法。  
  2. public delegate void SendOrPostCallback(object state); 

#p#

基于事件的異步模式的特征

1. 基于事件的異步模式可以采用多種形式,具體取決于某個特定類支持操作的復(fù)雜程度:

1) 最簡單的類可能只有一個 ***Async方法和一個對應(yīng)的 ***Completed 事件,以及這些方法的同步版本。

2) 復(fù)雜的類可能有若干個 ***Async方法,每種方法都有一個對應(yīng)的 ***Completed 事件,以及這些方法的同步版本。

3) 更復(fù)雜的類還可能為每個異步方法支持取消(CancelAsync()方法)、進度報告和增量結(jié)果(ReportProgress() 方法+ProgressChanged事件)。

4) 如果您的類支持多個異步方法,每個異步方法返回不同類型的數(shù)據(jù),您應(yīng)該:

a) 將您的增量結(jié)果報告與您的進度報告分開。

b) 使用適當(dāng)?shù)腅ventArgs為每個異步方法定義一個單獨的 ***ProgressChanged事件以處理該方法的增量結(jié)果數(shù)據(jù)。

5) 如果類不支持多個并發(fā)調(diào)用,請考慮公開IsBusy屬性。

6) 如要異步操作的同步版本中有 Out 和 Ref 參數(shù),它們應(yīng)做為對應(yīng) ***CompletedEventArgs的一部分,eg:

  1. public int MethodName(string arg1, ref string arg2, out string arg3);  
  2.    
  3. public void MethodNameAsync(string arg1, string arg2);  
  4. public class MethodNameCompletedEventArgs : AsyncCompletedEventArgs  
  5. {  
  6.     public int Result { get; };  
  7.     public string Arg2 { get; };  
  8.     public string Arg3 { get; };  

2. 如果你的組件要支持多個異步耗時的任務(wù)并行執(zhí)行。那么:

1) 為***Async方法多添加一個userState對象參數(shù)(此參數(shù)應(yīng)當(dāng)始終是***Async方法簽名中的最后一個參數(shù)),用于跟蹤各個操作的生存期。

2) 注意要在你構(gòu)建的異步類中維護一個userState對象的集合。使用 lock 區(qū)域保護此集合,因為各種調(diào)用都會在此集合中添加和移除userState對象。

3) 在***Async方法開始時調(diào)用AsyncOperationManager.CreateOperation并傳入userState對象,為每個異步任務(wù)創(chuàng)建AsyncOperation對象,userState存儲在AsyncOperation的UserSuppliedState屬性中。在構(gòu)建的異步類中使用該屬性標(biāo)識取消的操作,并傳遞給CompletedEventArgs和ProgressChangedEventArgs參數(shù)的UserState屬性來標(biāo)識當(dāng)前引發(fā)進度或完成事件的特定異步任務(wù)。

4) 當(dāng)對應(yīng)于此userState對象的任務(wù)引發(fā)完成事件時,你構(gòu)建的異步類應(yīng)將AsyncCompletedEventArgs.UserState對象從集合中刪除。

3. 注意:

1) 確保 ***EventArgs類特定于***方法。即當(dāng)使用 ***EventArgs類時,切勿要求開發(fā)人員強制轉(zhuǎn)換類型值。

2) 確保始終引發(fā)方法名稱Completed 事件。成功完成、異常或者取消時應(yīng)引發(fā)此事件。任何情況下,應(yīng)用程序都不應(yīng)遇到這樣的情況:應(yīng)用程序保持空閑狀態(tài),而操作卻一直不能完成。

3) 確保可以捕獲異步操作中發(fā)生的任何異常并將捕獲的異常指派給 Error 屬性。

4) 確保 ***CompletedEventArgs 類將其成員公開為只讀屬性而不是字段,因為字段會阻止數(shù)據(jù)綁定。eg:public MyReturnType Result { get; }

5) 在構(gòu)建 ***CompletedEventArgs 類屬性時,通過this.RaiseExceptionIfNecessary() 方法確保屬性值被正確使用。Eg:

  1. public int MethodName(string arg1, ref string arg2, out string arg3);  
  2.    
  3. public void MethodNameAsync(string arg1, string arg2);  
  4. public class MethodNameCompletedEventArgs : AsyncCompletedEventArgs  
  5. {  
  6.     public int Result { get; };  
  7.     public string Arg2 { get; };  
  8.     public string Arg3 { get; };  

2. 如果你的組件要支持多個異步耗時的任務(wù)并行執(zhí)行。那么:

1) 為***Async方法多添加一個userState對象參數(shù)(此參數(shù)應(yīng)當(dāng)始終是***Async方法簽名中的最后一個參數(shù)),用于跟蹤各個操作的生存期。

2) 注意要在你構(gòu)建的異步類中維護一個userState對象的集合。使用 lock 區(qū)域保護此集合,因為各種調(diào)用都會在此集合中添加和移除userState對象。

3) 在***Async方法開始時調(diào)用AsyncOperationManager.CreateOperation并傳入userState對象,為每個異步任務(wù)創(chuàng)建AsyncOperation對象,userState存儲在AsyncOperation的UserSuppliedState屬性中。在構(gòu)建的異步類中使用該屬性標(biāo)識取消的操作,并傳遞給CompletedEventArgs和ProgressChangedEventArgs參數(shù)的UserState屬性來標(biāo)識當(dāng)前引發(fā)進度或完成事件的特定異步任務(wù)。

4) 當(dāng)對應(yīng)于此userState對象的任務(wù)引發(fā)完成事件時,你構(gòu)建的異步類應(yīng)將AsyncCompletedEventArgs.UserState對象從集合中刪除。

3. 注意:

1) 確保 ***EventArgs類特定于***方法。即當(dāng)使用 ***EventArgs類時,切勿要求開發(fā)人員強制轉(zhuǎn)換類型值。

2) 確保始終引發(fā)方法名稱Completed 事件。成功完成、異常或者取消時應(yīng)引發(fā)此事件。任何情況下,應(yīng)用程序都不應(yīng)遇到這樣的情況:應(yīng)用程序保持空閑狀態(tài),而操作卻一直不能完成。

3) 確保可以捕獲異步操作中發(fā)生的任何異常并將捕獲的異常指派給 Error 屬性。

4) 確保 ***CompletedEventArgs 類將其成員公開為只讀屬性而不是字段,因為字段會阻止數(shù)據(jù)綁定。eg:public MyReturnType Result { get; }

5) 在構(gòu)建 ***CompletedEventArgs 類屬性時,通過this.RaiseExceptionIfNecessary() 方法確保屬性值被正確使用。Eg:

  1. private bool isPrimeValue;  
  2. public bool IsPrime  
  3. {  
  4.     get  
  5.     {  
  6.         RaiseExceptionIfNecessary();  
  7.         return isPrimeValue;  
  8.     }  

所以,在***Completed事件處理程序中,應(yīng)當(dāng)總是先檢查 ***CompletedEventArgs.Error 和 ***CompletedEventArgs.Cancelled 屬性,然后再訪問RunWorkerCompletedEventArgs.Result屬性。

#p#

BackgroundWorker組件

System.ComponentModel命名空間的BackgroundWorker組件為我們提供了一個簡單的多線程應(yīng)用解決方案,它允許你在單獨的線程上運行耗時操作而不會導(dǎo)致用戶界面的阻塞。但是,要注意它同一時刻只能運行一個異步耗時操作(使用IsBusy屬性判定),并且不能跨AppDomain邊界進行封送處理(不能在多個AppDomain中執(zhí)行多線程操作)。

1. BackgroundWorker組件

  1. public class BackgroundWorker : Component  
  2. {  
  3.     public BackgroundWorker();  
  4.    
  5.     // 獲取一個值,指示應(yīng)用程序是否已請求取消后臺操作。  
  6.     public bool CancellationPending { get; }  
  7.     // 獲取一個值,指示BackgroundWorker是否正在運行異步操作。  
  8.     public bool IsBusy { get; }  
  9.     // 獲取或設(shè)置一個值,該值指示BackgroundWorker能否報告進度更新。  
  10.     public bool WorkerReportsProgress { get; set; }  
  11.     // 獲取或設(shè)置一個值,該值指示BackgroundWorker是否支持異步取消。  
  12.     public bool WorkerSupportsCancellation { get; set; }  
  13.    
  14.     // 調(diào)用RunWorkerAsync() 時發(fā)生。  
  15.     public event DoWorkEventHandlerDoWork;  
  16.     // 調(diào)用ReportProgress(System.Int32) 時發(fā)生。  
  17.     public event ProgressChangedEventHandlerProgressChanged;  
  18.     // 當(dāng)后臺操作已完成、被取消或引發(fā)異常時發(fā)生。  
  19.     public event RunWorkerCompletedEventHandlerRunWorkerCompleted;  
  20.    
  21.     // 請求取消掛起的后臺操作。  
  22.     public void CancelAsync();  
  23.     // 引發(fā)ProgressChanged事件。percentProgress:范圍從 0% 到 100%  
  24.     public void ReportProgress(int percentProgress);  
  25.     // userState:傳遞到RunWorkerAsync(System.Object) 的狀態(tài)對象。  
  26.     public void ReportProgress(int percentProgress, object userState);  
  27.     // 開始執(zhí)行后臺操作。  
  28.     public void RunWorkerAsync();  
  29.     // 開始執(zhí)行后臺操作。argument:傳遞給DoWork事件的DoWorkEventArgs參數(shù)。  
  30.     public void RunWorkerAsync(object argument);  

2. 相應(yīng)的EventArgs類

  1. ///1)   System.EventArgs基類  
  2.     // System.EventArgs是包含事件數(shù)據(jù)的類的基類。  
  3.     public class EventArgs  
  4.     {  
  5.         // 表示沒有事件數(shù)據(jù)的事件。  
  6.         public static readonly EventArgs Empty;  
  7.         public EventArgs();  
  8.     }  
  9.    
  10. ///2)   DoWorkEventArgs類  
  11.     // 為可取消的事件提供數(shù)據(jù)。  
  12.     public class CancelEventArgs : EventArgs  
  13.     {  
  14.         public CancelEventArgs();  
  15.         public CancelEventArgs(bool cancel);  
  16.         // 獲取或設(shè)置指示是否應(yīng)取消事件的值。  
  17.         public bool Cancel { get; set; }  
  18.     }  
  19.     // 為DoWork事件處理程序提供數(shù)據(jù)。  
  20.     public class DoWorkEventArgs : CancelEventArgs  
  21.     {  
  22.         public DoWorkEventArgs(object argument);  
  23.    
  24.         // 獲取表示異步操作參數(shù)的值。  
  25.         public object Argument { get; }  
  26.         // 獲取或設(shè)置表示異步操作結(jié)果的值。  
  27.         public object Result { get; set; }  
  28.     }  
  29.    
  30. ///3)   ProgressChangedEventArgs類  
  31.     // 為ProgressChanged事件提供數(shù)據(jù)。  
  32.     public class ProgressChangedEventArgs : EventArgs  
  33.     {  
  34.         public ProgressChangedEventArgs(int progressPercentage, object userState);  
  35.    
  36.         // 獲取異步任務(wù)的進度百分比。  
  37.         public int ProgressPercentage { get; }  
  38.         // 獲取唯一的用戶狀態(tài)。  
  39.         public object UserState { get; }  
  40.     }  
  41.    
  42. ///4)   RunWorkerCompletedEventArgs類  
  43.     // 為MethodNameCompleted事件提供數(shù)據(jù)。  
  44.     public class AsyncCompletedEventArgs : EventArgs  
  45.     {  
  46.         public AsyncCompletedEventArgs();  
  47.         public AsyncCompletedEventArgs(Exception error, bool cancelled, object userState);  
  48.    
  49.         // 獲取一個值,該值指示異步操作是否已被取消。  
  50.         public bool Cancelled { get; }  
  51.         // 獲取一個值,該值指示異步操作期間發(fā)生的錯誤。  
  52.         public Exception Error { get; }  
  53.         // 獲取異步任務(wù)的唯一標(biāo)識符。  
  54.         public object UserState { get; }  
  55.    
  56.         // 訪問 AsyncCompletedEventArgs 及其派生類的屬性前調(diào)用此方法  
  57.         protected void RaiseExceptionIfNecessary()  
  58.         {  
  59.             if (this.Error != null)  
  60.             {  
  61.                 throw new TargetInvocationException(……);  
  62.             }  
  63.             if (this.Cancelled)  
  64.             {  
  65.                 throw new InvalidOperationException(……);  
  66.             }  
  67.         }  
  68.     }  
  69.     public class RunWorkerCompletedEventArgs : AsyncCompletedEventArgs  
  70.     {  
  71.         public RunWorkerCompletedEventArgs(object result, Exception error, bool cancelled);  
  72.    
  73.         // 獲取表示異步操作結(jié)果的值。  
  74.         public object Result { get; }  
  75.         // 獲取表示用戶狀態(tài)的值。  
  76.         public object UserState { get; }  
  77.     } 
3.   BackgroundWorker示例

示例代碼中包含了BackgroundWorker源代碼及對應(yīng)的使用示例,這里不粘貼代碼了,會導(dǎo)致篇幅更大。來個示例截圖吧:

image

示例分析:

1)   首先我們?yōu)锽ackgroundWorker組件注冊DoWork(異步操作)、ProgressChanged(進度報告) 和RunWorkCompleted(完成通知)事件;

2)   設(shè)置WorkerSupportsCancellation和WorkerReportsProgress屬性為true,以聲明組件支持取消操作和進度報告;

3)   使用RunWorkerAsync() 開啟異步操作,通過IsBusy屬性判斷是否已經(jīng)有異步任務(wù)在執(zhí)行;

4)   使用CancelAsync() 方法取消異步操作,但要注意:

a)   它僅僅是將BackgroudWorker.CancellationPending屬性設(shè)置為true。需要在具體DoWork事件中不斷檢查BackgroudWorker.CancellationPending來設(shè)置DoWorkEventArgs的Cancel屬性。

b)   DoWork事件處理程序中的代碼有可能在發(fā)出取消請求時完成其工作,輪詢循環(huán)可能會錯過設(shè)置為 true 的CancellationPending屬性。在這種情況下,即使發(fā)出了取消請求,RunWorkerCompleted事件處理程序中RunWorkerCompletedEventArgs的 Cancelled 標(biāo)志也不會設(shè)置為 true。這種情況被稱作爭用狀態(tài)。(可以通過直接監(jiān)控組件的CancellationPending屬性,來做判斷)

5)   確保在DoWork事件處理程序中不操作任何用戶界面對象。而應(yīng)該通過ProgressChanged和RunWorkerCompleted事件與用戶界面進行通信。

因為RunWorkerAsync() 是通過委托的BeginInvoke() 引發(fā)的DoWork事件,即DoWork事件的執(zhí)行線程已不是創(chuàng)建控件的線程(我在《異步編程:異步編程模型 (APM)》中介紹了幾種夸線程訪問控件的方式)。而ProgressChanged和RunWorkerCompleted事件是通過幫助器類AsyncOperation的 Post() 方法使其調(diào)用發(fā)生在合適的“線程或上下文”中。

#p#

自定義基于事件的異步組件

剛才我們介紹了BackgroundWorker組件,但是這個組件在一個時刻只能開啟一個異步操作,那如果我們要想同時支持多個異步操作、進度報告、增量結(jié)果、取消和返回結(jié)果值或異常信息該怎么辦呢?對的,我們可以為自己定義一個基于事件的異步組件。

我直接引用MSDN上的一則計算質(zhì)數(shù)的異步組件示例,請從我提供的示例代碼中獲取。

質(zhì)數(shù)算法:埃拉托色尼篩法

eg:判斷n是否為質(zhì)數(shù)

1、1和0既非素數(shù)也非合數(shù);

2、將2和3加入質(zhì)數(shù)集合primes;從n=5開始,通過 n+=2 來跳過所有偶數(shù);

3、循環(huán)集合primes中的質(zhì)數(shù)并將其做為n的因子,能整除的為合數(shù);

4、若不能整除,則繼續(xù)循步驟3直到“因子的平方>n”,即可判斷n為質(zhì)數(shù),并將其加入到集合primes。


 

來個示例截圖吧:

image

示例分析:(組件名:PrimeNumberCalculator)

1.   首先我們?yōu)镻rimeNumberCalculator組件注冊ProgressChanged(進度報告) 和CalculatePrimeCompleted(完成通知)事件;

2.   使用CalculatePrimeAsync(intnumberToTest, object taskId)開啟異步任務(wù),注意我們需要傳遞一個唯一標(biāo)識Guid taskId = Guid.NewGuid();用于標(biāo)識取消的操作,并傳遞給CompletedEventArgs和ProgressChangedEventArgs參數(shù)的UserState屬性來標(biāo)識當(dāng)前引發(fā)進度或完成事件的特定異步任務(wù);

3.   取消操作CancelAsync(object taskId),只是將taskId對應(yīng)的AsyncOperation實例移除內(nèi)部任務(wù)集合,耗時操作通過判斷taskId是否存在于集合來判斷其是否被取消;

此文到此結(jié)束,通過此博文我們認(rèn)識到:

1)   基于事件的異步編程是通過AsyncOperationManager類和AsyncOperation類兩個幫助器類確保你的異步操作支持在各種應(yīng)用程序模型(包括 ASP.NET、控制臺應(yīng)用程序和 Windows 窗體應(yīng)用程序)的適當(dāng)“線程或上下文”調(diào)用訪問控件;

2)   BackgroundWorker組件構(gòu)建、使用和缺點。

3)   展現(xiàn)如何構(gòu)建一個基于事件的異步組件,并且支持多個異步操作的并行運行

感謝大家的觀賞,如本文對你有幫助還請多幫推薦支持下……

原文鏈接:http://www.cnblogs.com/heyuquan/archive/2013/04/01/2993085.html

責(zé)任編輯:林師授 來源: 博客園
相關(guān)推薦

2009-08-20 17:47:54

C#異步編程模式

2013-03-08 09:33:25

JavaScript同步異步

2013-04-01 15:38:54

異步編程異步編程模型

2011-02-22 09:09:21

.NETAsync CTP異步

2011-02-22 08:49:16

.NET同步異步

2020-10-15 13:29:57

javascript

2009-08-20 17:30:56

C#異步編程模式

2015-09-07 14:08:32

Java編程異步事件

2017-07-13 12:12:19

前端JavaScript異步編程

2016-09-07 20:43:36

Javascript異步編程

2015-04-22 10:50:18

JavascriptJavascript異

2014-05-23 10:12:20

Javascript異步編程

2010-04-06 15:20:56

ASP.NET MVC

2024-04-01 09:45:50

TAP模式.NET異步編程

2017-08-02 15:00:12

PythonAsyncio異步編程

2021-08-02 11:13:28

人工智能機器學(xué)習(xí)技術(shù)

2021-12-10 07:47:30

Javascript異步編程

2017-05-05 08:44:24

PythonAsyncio異步編程

2011-11-11 15:47:22

JavaScript

2016-12-30 13:43:35

異步編程RxJava
點贊
收藏

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

欧美高清在线观看| 欧美日韩精品一区二区在线播放| 精品视频一区二区三区四区| 免费黄色片视频| 欧美高清在线| 日韩欧美一区在线观看| 欧美在线影院在线视频| 国内精品卡一卡二卡三| 精品国产三级| 91久久免费观看| 久久天天东北熟女毛茸茸| 黄色三级网站在线观看| 久久免费精品视频在这里| 精品少妇一区二区三区视频免付费| 久章草在线视频| 中日韩高清电影网| 久久影院视频免费| 产国精品偷在线| 欧美激情一区二区三区免费观看 | 亚洲一区二区三区四区在线观看| 欧美最近摘花xxxx摘花| fc2ppv在线播放| 秋霞蜜臀av久久电影网免费| 欧美福利一区二区| 免费国产成人av| 91九色porn在线资源| 国产精品国产三级国产a| 久久99影院| 亚洲精品久久久久久久久久 | 亚洲欧美一级二级三级| 亚洲日本欧美日韩高观看| 亚洲女则毛耸耸bbw| 最新亚洲国产| 91成人免费网站| 欧美a v在线播放| 免费在线观看的电影网站| 亚洲欧美aⅴ...| 亚洲影院色无极综合| 国产精品久久久久久人| 亚洲黄色大片| 欧美国产日产韩国视频| 国产一区二区精彩视频| 欧美成人激情| 在线午夜精品自拍| 阿v天堂2014| 九一国产精品| 亚洲欧美一区二区三区四区| 精品久久久久久中文字幕人妻最新| 97久久超碰| 精品捆绑美女sm三区| 色黄视频免费看| 日韩高清一区| 日韩欧美国产一区二区在线播放| av地址在线观看| 日本免费一区二区三区视频| 日韩一级精品视频在线观看| 亚洲图片 自拍偷拍| 欧美极品在线| 欧美日韩国产系列| 亚洲精品视频三区| 很黄的网站在线观看| 欧美国产日韩一二三区| 日韩欧美一区二区三区四区| 成人三级黄色免费网站| 中文一区在线播放| 最新国产精品久久| 中中文字幕av在线| 亚洲福利视频一区| 国产黄色一级网站| 成人免费一区| 亚洲一区二区三区四区五区中文 | 欧美人与性动xxxx| 国产女同无遮挡互慰高潮91| 精品一区二区三区在线观看视频| 日韩精品中文字幕一区二区三区 | 亚洲国产成人一区二区| 99久久精品费精品国产一区二区| 久久亚洲精品欧美| 香蕉视频在线播放| 一区二区三区在线观看欧美 | 九色porny丨国产精品| 亚洲在线www| 日韩精品一二| 国产精品一区二区在线播放| 99久久久精品免费观看国产 | 成人av手机在线观看| 久久综合福利| 黄网站免费在线播放| 亚洲国产aⅴ天堂久久| 50路60路老熟妇啪啪| 亚洲欧美在线人成swag| 亚洲第一中文字幕| 日韩av毛片在线观看| 日韩av系列| 中文字幕亚洲综合| 91精品国产高潮对白| 日本美女一区二区三区视频| 91传媒在线免费观看| 天堂av网在线| 亚洲欧美一区二区三区国产精品 | 国产一区二中文字幕在线看| 黄色av小说在线观看| 国产精品私房写真福利视频| 女人被男人躁得好爽免费视频| 女生影院久久| 欧美成人a视频| 国产激情av在线| 国产精品一区2区3区| 久久视频在线看| 久久亚洲精品石原莉奈 | 在线亚洲欧美专区二区| 绯色av蜜臀vs少妇| 日韩区欧美区| 伊人青青综合网站| 免费观看a级片| 亚洲激情社区| 91深夜福利视频| 国产精品无码白浆高潮| 久久综合久久综合久久| 亚洲天堂第一区| 625成人欧美午夜电影| 日韩欧美高清dvd碟片| 国产传媒在线看| 国产美女精品| 国产区一区二区| 亚洲电影视频在线| 欧美日韩在线播放三区四区| 国产不卡一二三| 你懂的国产精品永久在线| 国产精品偷伦视频免费观看国产| 亚洲欧美日本在线观看| 亚洲成人免费视| 国产精品欧美性爱| 一区二区三区在线观看免费| 成人黄色在线播放| 色三级在线观看| 欧美唯美清纯偷拍| 中文字幕亚洲影院| 日韩精品永久网址| 国产精品久久久久久久久久| 欧美美乳在线| 国产精品欧美久久久久一区二区| 亚洲欧洲日韩综合二区| 国产精品专区免费| 日韩精品中文字幕有码专区| 日本在线观看视频网站| 成人免费视频视频| 99久久久精品视频| 一区二区三区四区高清视频 | 国产中文字幕久久| 麻豆91在线播放免费| 亚洲精品国产精品国自产| 日本成人福利| 色偷偷偷亚洲综合网另类| 中文字幕有码视频| 亚洲欧美一区二区视频| 国产欧美精品一二三| 最新国产精品久久久| 99久久精品免费看国产一区二区三区 | 香港三级日本三级a视频| 丁香5月婷婷久久| 992tv成人免费影院| 三级在线电影| 欧美亚洲动漫制服丝袜| 黄色录像一级片| 国产精品一二三在| 黄色一级视频在线播放| 精品国模一区二区三区| 国产午夜精品视频免费不卡69堂| 中文字幕a级片| 亚洲人吸女人奶水| 日韩黄色一区二区| 亚洲在线黄色| 亚洲图色在线| 999久久久久久久久6666| 97人人模人人爽人人喊中文字| 日韩欧美在线番号| 欧美男同性恋视频网站| 美女视频黄免费| 91小视频在线免费看| 午夜激情av在线| 国内揄拍国内精品久久| 欧美日韩一区在线视频| 亚洲精品无播放器在线播放| 久久久久久成人精品| 欧美男男同志| 日韩欧美一区二区三区在线| 国产三级av片| 国产精品久久久久aaaa樱花| 性农村xxxxx小树林| 日韩电影免费一区| 国产女主播自拍| 禁断一区二区三区在线| 2019国产精品视频| 欧美xxx性| 久久99视频精品| 国产黄色在线| 337p日本欧洲亚洲大胆色噜噜| 中文无码av一区二区三区| 亚洲国产婷婷综合在线精品| 国产午夜精品久久久久久久久| 成人一区二区三区视频| 国产又大又黄又粗又爽| 99精品99| 男女啪啪的视频| 久久av导航| 国产精品v欧美精品∨日韩| avav成人| 欧美性一区二区三区| a级片国产精品自在拍在线播放| 亚洲欧洲一区二区三区在线观看 | 国产成人免费视频精品含羞草妖精| 视频一区二区三区免费观看| 999久久久精品一区二区| 国产在线视频不卡| 666av成人影院在线观看| 久久久亚洲成人| av在线免费观看网址| 这里只有精品视频| 日产精品久久久久久久性色| 欧美videos中文字幕| 一本久道久久综合无码中文| 色又黄又爽网站www久久| 国产成人啪精品午夜在线观看| 亚洲免费看黄网站| 三级黄色在线观看| 国产欧美精品区一区二区三区 | 91精品国产九九九久久久亚洲| av免费在线网站| 久久精品91久久久久久再现| eeuss影院www在线播放| 亚洲视频第一页| 欧美精品a∨在线观看不卡 | 中国日本在线视频中文字幕| 亚洲欧美精品一区二区| 天天色棕合合合合合合合| 精品人伦一区二区三区蜜桃网站| 黄色一级视频在线观看| 亚洲日本在线天堂| 国产精品成人无码免费| 久久精品视频一区| 蜜桃福利午夜精品一区| 日韩电影在线看| 国产福利影院在线观看| 美女精品在线观看| 精品久久久久久无码国产| 亚洲欧美日韩专区| 久久久久久久久久久免费视频| 国产日韩1区| 国产三区在线视频| 久久中文字幕一区二区三区| 国产精品jizz在线观看老狼| 色婷婷热久久| 人人妻人人澡人人爽精品欧美一区| 日韩精品欧美| 51xx午夜影福利| 亚洲小说区图片区| 免费看国产曰批40分钟| 先锋影音久久| 韩国视频一区二区三区| 久久99精品久久久久| 中文字幕第三区| 成人精品一区二区三区中文字幕 | 国产欧美精品国产国产专区 | 视频二区在线| 亚洲天堂日韩电影| 天天在线视频色| 色综合久久精品亚洲国产| 大桥未久在线视频| 日本最新高清不卡中文字幕| 狂野欧美性猛交xxxx| 不卡的av一区| 亚州综合一区| 亚洲最大福利网站| 高潮久久久久久久久久久久久久| 美女亚洲精品| 66久久国产| www.av中文字幕| 日韩成人av影视| 91人妻一区二区三区| 久久久久综合网| 久久久久99精品成人片试看| 精品女同一区二区三区在线播放| 波多野结衣在线观看视频| 欧美一区二区三区系列电影| 少妇人妻精品一区二区三区| 在线电影av不卡网址| 羞羞视频在线观看不卡| 日韩av男人的天堂| 日韩中文在线| 欧美午夜精品久久久久久蜜| 久久久国产精品| 北条麻妃69av| 伊人成人在线| 日本激情综合网| 成人永久看片免费视频天堂| 国产又粗又猛又爽又黄av| 又紧又大又爽精品一区二区| 亚洲乱码国产乱码精品| 欧美大片顶级少妇| 97视频在线观看网站| 久久免费视频在线观看| 日本一区二区中文字幕| 久久伊人一区| 欧美在线免费| 男人搞女人网站| 成人av片在线观看| 亚洲色婷婷一区二区三区| 欧美综合一区二区| 五月天福利视频| 久久久国产精品x99av| 亚洲日本网址| 国产一区二区久久久| 亚洲大全视频| 午夜宅男在线视频| 久久综合狠狠综合久久激情| 久久久国产精品黄毛片| 欧美人与禽zozo性伦| 丁香婷婷在线观看| 欧美亚洲视频在线观看| aiss精品大尺度系列| 亚洲国产精品日韩| 狂野欧美一区| av网站有哪些| 五月激情丁香一区二区三区| 性做久久久久久久久久| 久久综合免费视频| 日韩伦理一区二区| 亚洲精品成人久久久998| 男人天堂欧美日韩| 久久久久久久久免费看无码| 亚洲午夜激情av| 亚洲精品久久久久久久久久久久久久 | 日b视频在线观看| 亚洲愉拍自拍另类高清精品| 国产青青草视频| 久久香蕉国产线看观看av| 亚洲天堂网站| 一区二区三区一级片| 久久国产精品99久久人人澡| 国产午夜精品福利视频| 欧美亚洲高清一区| h网站在线免费观看| 国产精品久久久久久久久影视| 国产伦精品一区二区三区千人斩| 欧美激情国产精品日韩| xfplay精品久久| 中文字幕国产在线观看| 亚洲欧美日韩成人| 欧美www.| 一区二区三区的久久的视频| 久久精品噜噜噜成人av农村| 潘金莲一级黄色片| 777xxx欧美| 色呦呦呦在线观看| 国产日韩在线一区二区三区| 国产精品久久国产愉拍| 受虐m奴xxx在线观看| 欧美日韩中文国产| 黄色网址视频在线观看| 999视频在线观看| 亚洲日本国产| 最近中文字幕免费视频| 欧美三级在线视频| av网站免费在线观看| 国产精品青青草| 玖玖国产精品视频| 亚洲 欧美 国产 另类| 日韩一区二区三区免费看| 俄罗斯一级**毛片在线播放| 久久综合九色99| 蜜臀精品一区二区三区在线观看| 日韩欧美国产成人精品免费| 日韩免费在线观看| 在线观看福利电影| 亚洲欧洲日本国产| 成人av在线资源网| 一级特黄免费视频| 欧美巨猛xxxx猛交黑人97人| 理论片一区二区在线| 欧美日韩亚洲自拍| 夜夜嗨av一区二区三区中文字幕| 十八禁一区二区三区| 国产精品视频yy9099| 国产一在线精品一区在线观看| 亚洲精品在线视频免费观看| 欧美在线一二三四区| 天堂8中文在线| 日韩精品欧美在线| 国产**成人网毛片九色| 精品人妻一区二区三区潮喷在线| 久久综合网hezyo| 最近国产精品视频| 国产chinesehd精品露脸| 在线中文字幕一区| 97天天综合网| 亚洲欧美一二三| 国产日韩欧美精品综合| 亚洲国产成人精品一区二区三区| 国产精品麻豆va在线播放|