2013-04-10 13 views
12

私は、スレッドがworkA後に終了し、いくつかの遅延後workB(多分新しいスレッド内)を実行する必要がありますスレッド非同期のThread.sleep()

workA(); 
Thread.Sleep(1000); 
workB(); 

を忙しくすることなく、2つの操作の間の遅延を載せていきたいと思います。

それは、この擬似コードの一部equevalent

workA(); 
Thread.BeginSleep(1000, workB); // callback 

編集可能ですかしら 私のプログラムは、.NET 2.0

編集2である: System.Timers.Timer.Elapsedイベントは、イベントを発生させます1000ミリ秒後。タイマースレッドが1000ミリ秒間ビジー状態になるかどうかはわかりません。

+0

わかりません。あなたのThread.Sleep()コールは、スレッドをビジーにしないで2つの操作の間に遅延を入れます。私はあなたが望むものを誤解していますか? –

+0

はい、この期間(1000ミリ秒)のスレッドプールにはスレッドが1つ少なくなります。 – albert

+1

'System.Threading.Timer'を' System.Timers.Timer'ではなくSystem.Timers.Timerでなく 'no-timer timer 'にすると、待ち時間がOSカーネルで制御されます –

答えて

28

あなたは意味しています(私は、スレッドの経済を得るいけない):

また
Task.Delay(1000).ContinueWith(t => workB()); 

、手動Timerを作成します。これはasyncコードできれいに見えます

注:

async Task Foo() { 
    workA(); 
    await Task.Delay(1000); 
    workB(); 
} 

編集:あなたの.NET 2.0のアップデートで、あなたはコールバックとセットアップあなた自身のTimerする必要があります。 System.Threading.TasksTask APIを.NET 3.5にダウンするが、それは2.0にはならないし、b:Task.Delayが含まれているとは思わない。

+0

、さらにはTask.Delay(1000).Wait();に感謝します。 –

+3

@ジョシュあなたはちょうど私が少し泣いてしまった。しないでください。あなたが運が良ければ、ひどく非効率的です。あなたが不運な場合:スレッドをデッドロックしただけです。それはすべて同期コンテキストに依存します。同期待ちの場合: 'Thread.Sleep(1000)' –

+1

返事ありがとうございます、私はあなたがどこにいても私はこのことについてもっと読むことができるとは思いません。 (特にスレッド部分のデッドロック) –