2012-01-07 7 views
10

特定の条件が満たされるまでブロックされる(特定のタイムアウトが経過しない限り)一般的な方法で使用する方法を作成したいと考えています。特定の条件が満たされるまで「ブロック」する最良の方法

コードでの使用はのようなものだろう:私はしばらくの間(..)ループを使用して、それを実装しようとしている

WaitUntil(condition); 

、しかし、これは無駄のように思えます。

現在の実装では、TIMEOUTで期限切れになる「ワンオフ」タイマーを初期化しています。私はwhileループを実行していて、タイマーがタイムアウトしたかどうかをチェックしていれば例外をスローします。

このような方法を実装する簡単で効果的な手法はありますか?

+0

私は代理人とイベントを調べます – Joe

+3

ミューテックス、セマフォ、ManualResetEvent、AutoResetEvent、CountdownEventなどを見てください。System.Threadingネームスペースを見てください。 –

+3

もっと技術的に何かを同期したいと言っています。オペレーティングシステムは、whileループでビジー状態を待たないようにするメカニズムを提供します。 Yoyにはセマフォ、クリティカルセクション、手動/自動リセットイベントなどのオプションがあります。 1つを選択するには、あなたが待っているコンディションが何であるかを言う必要があります。同期のための1つの汎用関数は、WaitForSingleObjectです。 – pkmiec

答えて

4

条件のブロッキングは機能します(私はそれを個人的に使用する傾向があります)。しかし、ほとんどの場合、ここでより非同期的な方法でコーディングすることをお勧めします。状態が発生したときに発生します。これは、イベント、または最近では継続を伴うタスク(ContinueWith)を介して行うことができます。 C#5では、これをさらに「await」メタファで拡張して、これを透明にしています。それは「待つ」でブロックしているように、この

var foo = StartSomeWork(); 
... 
var result = await foo; 
Console.WriteLine(result); 

に見える - しかし、それは(タスクと仮定すると、すでに完了していない)実際には正反対です。これは、のデータが利用可能になったときにと呼ばれる継続を登録します。これはおそらく別のスレッドで発生します。

+1

+1のための非同期の言及 – diggingforfire

+0

このコードの唯一の問題は次のとおりです。私たちは.NET 3.5を使用していますが、バージョン5はまだありません:) CTPは3.5で動作しますか? ( 私はそうは思わない )。 –

+0

@liortal 4.0ではContinueWithを使用できます。私は生産コードのCTPを使用しません –

関連する問題