待機可能なThread.Sleepを取得する方法?


139

私はawait / sleepパラダイムに基づいてネットワークにバインドされたアプリケーションを書いています。

時々、接続エラーが発生し、私の経験では、しばらく待ってから操作を再試行するのにお金がかかります。

問題は、await / asyncでThread.Sleepまたは他の同様のブロック操作を使用すると、呼び出し元スレッドのすべてのアクティビティをブロックすることです。

同じ効果を得るには、Thread.Sleep(10000)を何に置き換えればよいですか。

await Thread.SleepAsync(10000)

更新

私は追加のスレッドを作成せずにこれを行う答えを好みます

回答:


323

新しいスレッドを開始することを示唆する他の答えは悪い考えです-それを行う必要はまったくありません。async/ のポイントの一部は、アプリケーションに必要なスレッドの数await減らすことです。

代わりに、新しいスレッドを必要Task.Delayせず、この目的のために正確に設計されたwhich を使用する必要があります。

// Execution of the async method will continue one second later, but without
// blocking.
await Task.Delay(1000);

私はまだa4.5のものとグリップに来ています。そのステートメントの後のコードの実行の分岐はどこにありますか?非スリーピング/ブロッキング部分はそれを実行しますか、それとも待機する「スレッド」を実行しますか?メインの非ブロッキング実行は、ブロックをそのままにしますか(別名リターン)?
ケニー2012年

1
ええ。これはまさに私が必要とするものです
Arsen Zahray

1
@kenny:私のasyncイントロが役に立つかもしれません。によって返されたawaitable Task.Delayawait編集されると、それが完了していないため、現在のメソッドは不完全なタスクを返します。その後、がDelay完了すると(スレッドではなくタイマーがオフになると)、残りのメソッドの実行がスケジュールされます。継続は、「コンテキスト」で実行する私のブログの詳細-同じ元のスレッドに戻ります。
Stephen Cleary

@StephenClearyありがとうございます。だから私は、待機後のコードが実行のために「スケジュールされ」、呼び出しスレッドが戻ると言ってもいいですか?
ケニー2012年

2
はい、呼び出しスレッドは(即座に)戻り、awaitスケジュールされた後のコードは(最終的に)戻ります。
Stephen Cleary
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.