2017-08-23 8 views
1

サーバからデータを非同期的に取得するには、getData.BeginInvoke(callback, null)を使用します。ここで、getDataはデータを取得するメソッドです。 callbackは、検索されたデータに関する通知をいくつか行います(&)。コールバックのハンドルを待つ

呼び出しメソッドでは、私はWaitHandleを使用してメソッドが完了するのを待つことをお勧めします。私の質問は:WaitHandleもコールバックが完了するのを待っていますか?そうでない場合は、どうすればいいですか?

コード:

Func<Data> getData =() => 
{ 
    //... 
}; 

AsyncCallback callback = (IAsyncResult ar) => 
{ 
    //... 
}; 

IAsyncResult result = getData.BeginInvoke(callback, null); 

result.AsyncWaitHandle.WaitOne(); 

注1:私はフレームワーク3.5を使用する必要がありますので、私はasync & await

注2を使用することはできません:私はこの質問はthis postの重複ではないと思います。

+0

実際に、あなたは他に何もデータつつ、同時に行うことができない場合非同期は(メソッドであなたの最後のものを呼び出すようにしたいと思いますコールバックであなたの流れを続ける。 asyncメソッドが返ってくると、コールバックが呼び出されます。 – Fildor

+1

これはいくつかの光を放つかもしれません:https://docs.microsoft.com/en-us/dotnet/standard/asynchronous-programming-patterns/calling-synchronous-methods-asynchronously非同期操作を開始した直後のブロックは、通常、多くのセンス。関数を同期して呼び出すこともできます。 – Fildor

+1

これは、待機ハンドルをどこに設定するかによって異なります。 msdnソケットの例を見てください:https://msdn.microsoft.com/en-us/library/bew39x2a(v=vs.100).aspx – jdweng

答えて

1

あなたが正しいです、WaitOneはBeginInvokeのターゲットが完了したことを意味しますが、コールバックの完了を保証するものではありません。手動で自分でそれを処理するためにManualResetEventを使用する必要があり、この場合:

Func<Data> getData =() => 
    { 
     //... 
    }; 
    AsyncCallback callback = (IAsyncResult ar) => 
    { 
     // do your thing... 
     getData.EndInvoke(ar); 
     waiter.Set(); 
    }; 

    ManualResetEvent waiter; 

    void DoWork() 
    { 
     waiter = new ManualResetEvent(false); 
     IAsyncResult result = getData.BeginInvoke(callback, null); 
     waiter.WaitOne(); 
     //Callback has finished 
    } 
+0

ここでも、非同期操作を使用する際のポイントは何ですか?あなたがそれを開始した直後に終わる? – Fildor

+0

@Fildor彼は彼の中には何も示していない可能性が高いです。彼が提供したコードは要約されているだけで、彼が持っている問題を示しているので、彼は彼が探している答えを彼に提供します。 – Hubbs

+0

答えのための@Hubbsありがとう、それは私が探していたものです... –