本質上適合非同步的操作有:HTTP請求,資料庫指令,Web服務調用等。 1、暫停一段時間(以非同步方式)。 以非同步的方式暫停一段時間,這在進行單元測試或者重試延遲時非常有用。 Task類有一個返回Task對象的靜態函數Delay,下麵是其中的一個 一個簡單的指數退避。指數退避是一種重試策略,重試的延遲時 ...
本質上適合非同步的操作有:HTTP請求,資料庫指令,Web服務調用等。
1、暫停一段時間(以非同步方式)。
以非同步的方式暫停一段時間,這在進行單元測試或者重試延遲時非常有用。
Task類有一個返回Task對象的靜態函數Delay,下麵是其中的一個
public static Task Delay(TimeSpan delay) { return Task.Delay(delay, default(CancellationToken)); }
一個簡單的指數退避。指數退避是一種重試策略,重試的延遲時間會逐次增加。在訪問web服務時可採用指數退避,它可以防止伺服器被太多的重試阻塞。
private async Task<string> DownLoadString(string url) { using (var client = new HttpClient()) { //第一次重試前等1秒,第二次重試前等2秒,第三次重試前等4次 var nextDelay = TimeSpan.FromSeconds(1); for (int i = 0; i < 3; i++) { try { return await client.GetStringAsync(url); } catch { } await Task.Delay(nextDelay); nextDelay = nextDelay + nextDelay; } //最後一次調用,以便讓調用者知道出錯信息 return await client.GetStringAsync(url); } }
總結:Task.Delay 適合用於對非同步代碼進行單元測試或者實現重試邏輯。
2、返回完成的任務 Task.FromResult
當要實現一個既有非同步簽名的同步方法 或者 對非同步代碼進行單元測試時,都可以使用Task.FromResult。
Task.FromResult方法創建並返回一個新的Task<T>對象,這個Task對象是已完成,並具有特定的值。
/// <summary>Creates a <see cref="T:System.Threading.Tasks.Task`1" /> that's completed successfully with the specified result.</summary> /// <param name="result">The result to store into the completed task. </param> /// <typeparam name="TResult">The type of the result returned by the task. </typeparam> /// <returns>The successfully completed task.</returns> public static Task<TResult> FromResult<TResult>(TResult result) { return new Task<TResult>(result); }
備註:如果使用Task.FromResult反覆調用同一參數,可考慮用一個實際的task變數,以減少垃圾回收的次數。