輕度解析異步~Task.Delay

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屬性的值
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章