C#の非同期操作に

ここでは、アプリケーションを停止したい場合は、あなたが直接非同期処理が継続完了するまでアプリケーションを防止Endメソッドを呼び出すことができますC#の非同期操作を開始しています。

使用非同期操作非同期操作およびイベントは、IAsyncResultオブジェクトを使用する:.NET Frameworkは、非同期操作のための2つのデザインパターンを提供します。学ぶことはかつての最初の

アウトライン

BeginOperationNameとEndOperationNameようBeginRead FileStreamクラスと呼ばれる2つの方法で同期元のメソッドを呼び出すたIAsyncResult非同期非同期設計パターンは、方法及び読むの非同期バージョンのファイルから読み取らEndRead非同期バイトを提供します

任意のパラメータの方法は、同期メソッドシグネチャを開始し、また二つの追加パラメータを含む:AsyncCallbackデリゲートステータスとユーザ定義オブジェクトを。呼び出されるコールバックメソッドに委譲、オブジェクトの状態は、コールバックメソッドにステータス情報を伝えるために使用されます。この方法は、インターフェースを実装するオブジェクトを返したIAsyncResult

C#エンド非同期操作を終了し、結果を返すための方法、及び同期署名REFとOUTパラメータ、戻り型と同一の同期方法を含む従って方法。この方法はさらに、着信オブジェクト・インスタンス対応するメソッド戻りを開始する場合、当然のことながら、使用されなければならない非同期動作が完了したか否かについての情報を取得するたIAsyncResultパラメータを含みます

C#の非同期操作は、アプリケーションを停止したい場合は、開始した後、あなたが直接非同期処理が継続完了するまでアプリケーションを防止Endメソッドを呼び出すことができます。また、スレッドをブロックするWAITONE他のメソッドを呼び出したIAsyncResult AsyncWaitHandleプロパティを、使用することができます。これらの2つの方法の違いは小さいが、後者はタイムアウトを待つように設定することができる前者は待たなければなりません

アプリケーションがブロックされていない場合、それが完了するたIAsyncResultステータスポーリング動作が完了し、または使用AsyncCallbackデリゲートC#の非同期操作を終了するか否かによって判断することができます。AsyncCallbackデリゲートの署名がたIAsyncResult内部コールバックメソッドが含まれており、その後の操作の結果を得るためにEndメソッドを呼び出します

試します

今日のヒーロー、たIAsyncResultインターフェイスをよく理解して最初の

 
  
  1. パブリックインターフェイスたIAsyncResult  
  2. {  
  3. オブジェクトAsyncState {取得します。}  
  4. WaitHandle AsyncWaitHandle {取得します。}  
  5. CompletedSynchronously BOOL {取得します。}  
  6. 完了するBOOL {取得します。}  

私は非同期メソッドのプロバイダとしてAsyncDemoクラスを使用して、プログラムをコールバックします。内部は+名前として名前,,とデリゲートとBeginInvokeメソッドEndInvokeをメソッドを使用して直接非同期メソッド「私の名前は」コンストラクタメソッドは文字列の出力ファイル名を指定して実行を受けて、非常に単純なものでした。

 
  
  1. パブリッククラスAsyncDemo  
  2. {  
  3. //非同期メソッドで使用します  
  4. プライベートデリゲート列runDelegate();  
  5. プライベート文字列M_NAME。  
  6. プライベートrunDelegate m_Delegate。  
  7. 公共AsyncDemo(文字列名)  
  8. {  
  9. M_NAME  =  名前 ;  
  10. m_Delegate  =  新しい  runDelegate(ラン)。  
  11. }  
  12. / ** ////  
  13. ///同期方法  
  14. ///  
  15. ///  
  16. 公共の文字列を実行します()  
  17. {  
  18. リターンは+ M_NAME「私の名前はあります」。  
  19. }  
  20. / ** ////  
  21. ///非同期メソッドを開始  
  22. ///  
  23. ///  
  24. ///  
  25. ///  
  26. パブリックたIAsyncResult BeginRun(AsyncCallbackコールバック、オブジェクトstateObject)  
  27. {  
  28. 試します  
  29. {  
  30. m_Delegate.BeginInvoke(コールバック、stateObject)を返します。  
  31. }  
  32. キャッチ(例外e)  
  33. {  
  34. //メソッドの呼び出しスタックの内部を隠します  
  35. Eを投げます。  
  36. }  
  37. }  
  38. / ** ////  
  39. ///非同期終了方法  
  40. ///  
  41. ///  
  42. ///  
  43. 公共の文字列EndRun(たIAsyncResultのAR)  
  44. {  
  45. もし(AR  == nullの)  
  46. (「Arggument Arはnullにすることはできません」)新しいとNullReferenceExceptionを投げます。  
  47. 試します  
  48. {  
  49. m_Delegate.EndInvoke(AR)を返します。  
  50. }  
  51. キャッチ(例外e)  
  52. {  
  53. //メソッドの呼び出しスタックの内部を隠します  
  54. Eを投げます。  
  55. }  
  56. }  

まず、開始直後Endメソッドを呼び出して、もちろん、真ん中は、他の操作を行うことができます。

 
  
  1. クラスAsyncTest  
  2. {  
  3. 静的な無効メイン(文字列[] args)  
  4. {  
  5. AsyncDemoの  デモ  =   AsyncDemo( "jiangnii");  
  6. //メソッドを開始し実行します  
  7. たIAsyncResult  AR  =  デモ .BeginRun(NULL、NULL);  
  8. //ここに他のことを行うことができます  
  9. 操作が完了するまで//スレッドをブロックするために、エンドメソッドを使用します  
  10. 文字列の  デモ削除名  = demo.EndRun(AR);  
  11. Console.WriteLineを(demoName)。  
  12. }  

また、AsyncWaitHandleプロパティたIAsyncResultを使用することができ、私はここに1秒のタイムアウトです。

 
  
  1. クラスAsyncTest  
  2. {  
  3. 静的な無効メイン(文字列[] args)  
  4. {  
  5. AsyncDemoの  デモ  =   AsyncDemo( "jiangnii");  
  6. //メソッドを開始し実行します  
  7. たIAsyncResult  AR  =  デモ .BeginRun(NULL、NULL);  
  8. //ここに他のことを行うことができます  
  9. //使用AsyncWaitHandle.WaitOne方法は、最大で1秒間のスレッドをブロックします  
  10. ar.AsyncWaitHandle.WaitOne(1000年、偽);  
  11. もし(ar.IsCompleted)  
  12. {  
  13. //それでも結果を得るためにendメソッドを使用し必要な、   
  14. //しかし、この時間は、それはすぐに戻ります  
  15. 文字列の  デモ削除名  = demo.EndRun(AR);  
  16. Console.WriteLineを(demoName)。  
  17. }  
  18. 他  
  19. {  
  20. Console.WriteLineを(「申し訳ありませんが、demoNameを得ることができない、時間が経過します」);  
  21. }  
  22. }  

途切れのないラウンドロビン、各サイクルの出力A「」

 
  
  1. クラスAsyncTest  
  2. {  
  3. 静的な無効メイン(文字列[] args)  
  4. {  
  5. AsyncDemoの  デモ  =   AsyncDemo( "jiangnii");  
  6. //メソッドを開始し実行します  
  7. たIAsyncResult  AR  =  デモ .BeginRun(NULL、NULL);  
  8. Console.Write( "待機中..");  
  9. しばらく(!ar.IsCompleted)  
  10. {  
  11. Console.Write( "");  
  12. //ここに他のことを行うことができます  
  13. }  
  14. Console.WriteLineを();  
  15. //それでも結果を得るためにendメソッドを使用し必要な、   
  16. //しかし、この時間は、それはすぐに戻ります  
  17. 文字列の  デモ削除名  = demo.EndRun(AR);  
  18. Console.WriteLineを(demoName)。  
  19. }  

最後の方法は、オブジェクトの状態は、パラメータは、コールバックメソッドに渡されたIAsyncResult AsyncState財産であるとして、コールバック・ステータス・オブジェクトを使用することですプラス。私は単にここに1秒をスリープ状態に許可され、コールバックメソッドの実行前にメインスレッドが終了を任せることはできません。もう1つの違いは、以前のAsyncDemoオブジェクトに定義されたstaticフィールドは、コールバックメソッドを使用するためにクラスになったということです

 
  
  1. クラスAsyncTest  
  2. {  
  3. 静的AsyncDemoの  デモ  =   AsyncDemo( "jiangnii");  
  4. 静的な無効メイン(文字列[] args)  
  5. {  
  6. // Stateオブジェクト  
  7. ブール  状態  =  ;  
  8. //メソッドを開始し実行します  
  9. たIAsyncResult  AR  =  デモ .BeginRun(新しいAsyncCallback(出力)、状態)。  
  10. //ここに他薄くなりを行うことができます  
  11. コールバックが終了するまで待ちます//  
  12. System.Threading.Thread.Sleep(1000);  
  13. }  
  14. //コールバックメソッド  
  15. 静的な無効出力(たIAsyncResultのAR)  
  16. {  
  17. ブール  状態  =(BOOL)ar.AsyncState。  
  18. 文字列の  デモ削除名  = demo.EndRun(AR);  
  19. (状態)の場合  
  20. {  
  21. Console.WriteLineを(demoName)。  
  22. }  
  23. 他  
  24. {  
  25. Console.WriteLineを(demoName + "は、それはないですか?");  
  26. }  
  27. }  

C#の非同期操作の概要

目標を達成し、EndOperationName BeginOperationName法されてきたために、対応する非同期メソッドを増やす必要はなく、単にデリゲートを定義していない、我々は直接、上記のように呼び出すことができますが、唯一のオブジェクトの同期方法のために、我々は非同期呼び出しでなければなりませんその上にそのBeginInvokeメソッドとEndInvokeをメソッドを使用します




ます。https://www.cnblogs.com/kevinGao/archive/2011/11/30/2270743.htmlで再現

おすすめ

転載: blog.csdn.net/weixin_34148340/article/details/93766860