非同期依頼の使い方

6530 ワード

http://www.cnblogs.com/everx/archive/2006/09/30/everx.html (原URL)
            依頼ごとに3つの方法があります。Invoke、BeginInvoke、End Invoke。最初の方法は、指定された関数の同期呼び出しを依頼し、他の2つは非同期呼出しです。
        BeginninInvokeメソッドは、呼び出し後すぐに戻ります。呼び出し結果を待っていません。EndInvokeメソッドは、呼び出し結果を検索するために使用されます。BeginninInvokeを呼び出したらいつでもEndInvokeメソッドを呼び出すことができます。非同期呼び出しが完了していない場合、EndInvokeは非同期呼び出し完了までブロックされます。EndInvokeのパラメータには、非同期的に実行する方法が必要なoutとrefパラメータ(Visual Baicでは「Out」ByRefとByRef)と、BeginInvokeで返されるIAsyncReultが含まれています。
        BeginninInvoke非同期方法の署名のルールは、
  • は、すべてのINパラメータを含む。
  • は、すべてのOUTパラメータを含む。
  • は、すべてのIN/OUTパラメータを含む。
  • は、全てのByRefパラメータを含む。
  • は、最後の2つのパラメータとしてAyncCallbackとAsync Stateを取得します。
  • はIAsyncResultに戻る。
  •         End Invoke非同期方法の署名のルールは以下の通りです。
  • は、すべてのIN/OUTパラメータを含む。
  • は、すべてのOUTパラメータを含む。
  • は、全てのByRefパラメータを含む。
  • は、IAsyncResultを最後のパラメータとする。
  • は、元の方法から元の戻りタイプに署名を返す。
  •         結果オブジェクトは、開始操作から戻り、非同期開始動作が完了したかどうかを取得するために使用されます。その結果、オブジェクトは呼び出しの最終的な戻り値を返す終了動作に渡される。開始操作では任意のコールバックが提供されます。コールバックが提供されたら、コールが完了したら、コールバックを呼び出します。また、コールバックのコードは終了操作を呼び出すことができます。
    AyncCallback依頼
            AyncCallbackは、操作開始後に呼び出すべき方法を指定するために依頼します。以下はこの依頼の署名で、AyncCallback依頼は開始操作上の第二のパラメータとして最後まで渡されます。
            public delegate void AsyncCallback(IAsyncResult ar);
     
       
    IAsyncResult   
     
       
            IAsyncResultインターフェースは、非同期動作を監視し管理するために使用される。インターフェースは、動作開始から戻り、終了動作に伝達され、動作開始と終了動作を関連付ける。チューニングが開始操作の一部として指定された場合、AyncResoultはコールバックに渡される。以下のコードは、非同期動作の状態を監視し、開始動作にも伝達される非同期状態オブジェクトを取得するために使用できるIAsyncResultインターフェースの属性を説明する。
    public interface IAsyncResult
    {
      Object AyncState{get;}                       //この属性はBeginInvokeパラメータの最後のパラメータオブジェクトです。
      Waithandle AyncWaithandle{get;}
      book Compleeted Synch ronously{get;}
      book Is Completted{get;}                         //この属性は非同期呼び出しが終了したかどうかを判断します。
    )
  • AsyncState
  •         動作開始方法の呼び出し中に最後のパラメータとして提供されたオブジェクトを返します。
  • AyncWaithandle
  •         Aync Waithandle属性はWaithandleに戻り、後者はWaithandle.Waitone、WaitAnyまたはWaitAllを実行するために使用されます。
            注意   AyncWaithandle属性が読み取られるまで、IAsyncResultのオブジェクトを実現するにはWaithandleを作成する必要があります。実行時間は実施者が決定する。実施者がWaithandleを作成した場合、実施者は、適切なタイミングでWaithandle信号を送るのを待つ必要がある。例えば、非同期で起動した方法が戻った場合、AyncResoultは、呼び出し元の待機を表します。作成後、Waithandleは非同期動作を終了するまでアクティブな状態を維持します。この場合、AyncWaithandle後のオブジェクトを破棄することができます。
  • Copleted Synch ronously
  •         起動操作が同期されたらCompletteed Synch ronously属性はtrueに設定されます。
  • Is Completted
  •         サーバーが起動処理された後、Is Complettedのプロパティはtrueに設定されます。
            BeginninInvokeを呼び出したら、次のようにできます。
  • は、いくつかの動作を行い、その後、End Invokeを呼び出して呼び出しが完了しました。
  • IAsyncResult.AsyncWaithandleを使ってWaithandleを取得し、WaitOneを使用してWaithandle信号を送るまでブロックしてEnd Invokeを呼び出します。
  • ポーリングはBeginInvokeによって返されたIAsyncResoultで、非同期コールがいつ完了するかを決定し、EndInvokeを呼び出します。
  • は、コールバック方法のための委託をBeginninvokeに渡す。この方法は非同期呼び出しが完了した後、ThreadPoolスレッド上で実行され、EndInvokeを起動することができる。
  •         注: 常に非同期呼び出しが完了したら、EndInvokeを呼び出します。
            非同期依頼に関するテストコードは以下の通りです。
    using System
    using System.Threading;
     
    public class AyncDemo{
        // The method to be executed asynch ronously.
        //
        public string TestMethod(int calDuration、out int threadId){
            Consone.WriteLine(「Test method begins.」)
            Thread.Sleep(calDuration)
            threadId=App Domain.Get Currennt ThreadId()
            return「MyCallTime was」+calDuration.ToString()
        }
    )
     
    //The delegate must have the same signature as the method
    //you want to call asynch ronously.
    public delegate string AyncDelegate(int calDuration、out int threadId);
     
    public class AyncMain{
        static void
    Main
    (string[]args){
            // The asynch ronous method put the thread id here.
            int threadId
     
            // Create an instance of the test class.
            AyncDemoad=new AyncDemo()
     
            // Create the delegate.
            AcyncDelegate dlt=new AsyncDelegate(ad.TestMethod)
      
            // Initiate the asychronous call.
            IAsyncResult ar=dlt.BeginninInvoke(3000、
                out threadId,null,null);
     
            Thread.Sleep(0)
            Consone.WriteLine("Main thread{0}does some work."
                App Domain.Get Curent ThreadId();
     
            // Wait for the Wait Handle to become signaled.
            ar.Aync Waithandle.WaitOne()
    /*               これはポーリング非同期実行状態です。
            // Poll while simullating work.
            while(ar.Is Completted==false)
            {
                Thread.Sleep(10)
            }
    */
            // Call End Invoke to Wait for the asynchronous call to complete、
            // and to retrieve the reults.
            string ret=dlt.End Invoke(out threadId,ar)
     
            Consolie.WriteLine(「The call executed on thread{0},with return value\」{1},threadId,ret);
        }
    )
     
            以下のコードは、EndInvokeメソッドをコールバック関数で実行します。
    public class AyncMain{
        // Aynch ronous method puts the thread id here.
        prvate static int threadId;
     
        static void
    Main
    (string[]args){
            // Create an instance of the test class.
            AyncDemoad=new AyncDemo()
     
            // Create the delegate.
            AcyncDelegate dlt=new AsyncDelegate(ad.TestMethod)
      
            // Initiate the asychronous call.  Include an AyncCallback
            // delegate representing the calback method,and the data
            // need to call End Invoke.
            IAsyncResult ar=dlt.BeginninInvoke(3000、
                out threadId、
                new AyncCallback(CallbackMethod)
                dlt;
     
            Consone.WriteLine(「Press Enter to close appration.」)
            Consone.Readline()
        }
       
            
        // Callback method must have the same signature as the
        // AyncCallback delegate.
        static void CallbackMethod(IAsyncResult ar){
            // Retrieve the delegate.
            AsyncDelegate dlt=(AcDelegate)ar.Aync State;
     
            // Call End Invoke to retrieve the rerrults.
            string ret=dlt.End Invoke(out threadId,ar)
     
            Consolie.WriteLine(「The call executed on thread{0},with return value\」{1},threadId,ret);
        }
    )