2012-11-17 47 views
72

我正在寫一個基於await/sleep範例的網絡綁定應用程序。如何獲得可等待的Thread.Sleep?

有時會發生連接錯誤,根據我的經驗,等待一段時間並再次重試操作會付出代價。

問題是,如果我在等待/異步中使用Thread.Sleep或某些類似的阻塞操作,它會阻止調用者線程中的所有活動。

我應該將其替換了Thread.Sleep(10000),以作爲acheave

await Thread.SleepAsync(10000) 

同樣的效果?

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' intro](http://nitoprograms.blogspot.com/2012/02/async-and-await.html)有幫助。當'Task.Delay'返回的awaitable等待時,由於它沒有完成,當前的方法返回一個不完整的任務。稍後,當'Delay'完成時(關閉計時器,而不是線程),該方法的其餘部分計劃運行。延續運行在一個「上下文」中,可以*返回到同一原始線程 - 我的博客上的詳細信息。 –