2012-11-17 4 views
72

私はawait/sleepパラダイムに基づいてネットワーク接続のアプリケーションを作成しています。待っているThread.Sleepを取得する方法?

接続エラーが発生することがあります。私の経験上、しばらく待って操作をやり直してください。

問題は、await/asyncでThread.Sleepなどのブロッキング操作を使用すると、呼び出し元スレッドのすべてのアクティビティがブロックされるという問題です。

私は

await Thread.SleepAsync(10000) 

と同じ効果をacheaveすると(10000)のThread.sleepを交換する必要がありますか?

UPDATE

私は、任意の追加のスレッド

答えて

186

新しいスレッドを開始示唆他の回答を作成せずにこれを行い答えを好むだろう悪い考えです - すべてでそれをする必要はありません。 async/awaitの部分はになります。あなたのアプリケーションに必要なスレッド数を減らしてください。

あなたは代わりに使うべきは、新しいスレッドを必要とせず、この目的のために正確に設計されましたTask.Delay

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

が、私はまだA4.5のものとグリップに来ています。そのステートメントの後のコードで実行の分岐はどこですか?非スリープ/ブロッキング部分はそれを実行するか、待機する「スレッド」を実行しますか?主なノンブロッキング実行は、ブロックを次のように残すか(別名リターン)? – kenny

+0

ええ。これは私が必要とするものです。 –

+1

@kenny:私の['async'イントロ](http://nitoprograms.blogspot.com/2012/02/async-and-await.html)が役立つかもしれません。 'Task.Delay'によって返された待遇が' await'edであるとき、それは完了していないので、現在のメソッドは不完全なタスクを返します。後で、「遅延」が完了すると(スレッドではなくタイマーから)、メソッドの残りの部分が実行されるようにスケジュールされます。継続は、同じ元のスレッドに戻るかもしれない "文脈"で実行されます - 私のブログの詳細。 –

関連する問題