2011-01-22 31 views
4

私は非同期呼び出しのみを許可するライブラリを持っています。私のコードは同期する必要があります。次のコードは正しく動作しますか?誰もそれに問題を予見できますか?C#非同期呼び出しの同期化

RestResponse<T> response = null; 
bool executedCallBack = false; 
client.ExecuteAsync(request, (RestResponse<T> aSyncResponse)=>{ 
    executedCallBack = true; 
    response = aSyncResponse; 
}); 

while (!executedCallBack){ 
    Thread.Sleep(100); 
} 
..continue execution synchronously 

答えて

8

投票しないでください。組み込みの同期機能を使用します。

RestResponse<T> response = null; 
var executedCallBack = new AutoResetEvent(false); 
client.ExecuteAsync(request, (RestResponse<T> aSyncResponse)=>{ 
    response = aSyncResponse; 
    executedCallBack.Set(); 
}); 

executedCallBack.WaitOne(); 
//continue execution synchronously 

補足として、コールバック内の操作の順序を切り替える必要がありました。あなたの例では、コールバックスレッドがそれを書き込む前に、フラグがメインスレッドを続行し、応答を読み込もうとする可能性があるため、競合状態が発生しました。

2

通常の非同期呼び出しは、ポーリングなしに、あなたはそれを待つことができますトークン(例えばIAsyncResult)のいくつかの並べ替えを返します。あなたのAPIはそれをまったくしませんか?

別のオプションは、スリープループの代わりにManualResetEventまたはMonitor.Wait/Pulseを使用することです。

+0

いいえ、私はIAsyncResultを取得しません。以下のManualResetEventとAutoResetEventの違いは何ですか? –

+1

ワンショット使用の場合、違いはありません。 'ManualResetEvent'はあなたが' Reset() 'を呼び出すまで" set "状態のままですが、' AutoResetEvent'は待機中のスレッドのブロックを解除した後に自動的にリセットされます。通常、これはあなたが望むものです。私は特に、複数の待機中のスレッド(または同じスレッドによる連続した待機)が解放されるようにしたいときにのみ、 'ManualResetEvent'を使用します。 –

関連する問題