1.暫停一段時間
public static Task ShortDelay(TimeSpan delay)
{
await Task.Delay(delay);
Console.WriteLine(string.Format("延遲{0}", delay));
}
解析:
- 異步編程使用async與await關鍵字,搭配返回Task或其泛型
- async的存在是爲了代碼中await的生效
- 如果沒有返回值,更推薦寫爲Task,而不是void
- Task.Delay()是異步編程提供的延遲方法,如果你想延遲兩秒,可以Task.Delay(2000);
- 當Task.Delay(delay);執行後,會異步延遲delay的時間,在延遲的同時,執行下方的Console
- 當這行代碼前+await,會等待異步延遲的執行結束後,執行下方的Console
2.實現簡單的指數退避策略
pulic static async Task ToDoRetries()
{
var nextDelay = TimeSpan.FromSeconds(1);
for(int i = 0; i<3; i++)
{
return await DoSometingAsync();
nextDelay += nextDelay;
await Task.Delay(nextDelat);
}
}
解析:
- 退避策略:防止被訪問的頻繁被阻塞
3.實現超時處理
private static async Task<string> ToDoAsync()
{
await Task.Delay(TimeSpan.FromSeconds(3));
return "To Do Success!";
}
public static async Task<string> ToDoWithTimeOut()
{
var toDoTask = ToDoAsync();
var timeOutTask = Task.Delay(TimeSpan.FormSeconds(3));
var completedTask = await Task.WhenAny(toDoTask, timeOutTask);
if(completedTask == timeOutTask)
{
return "";
}
return await toDoTask;
}
解析:
- Task.WhenAny(toDoTask, timeOutTask);是隻要其中有一個異步,或者說是任務完成,就返回
- 最費解就是最後最後一行,toDoTask是一個Task,並不是異步方法,爲什麼前面還有await,當將await去掉後:
斷點後發現,toDoTask是一個Task類型,其中有id,status等屬性,如果在Task類型前+await,獲取的是Task類型中Result屬性的值