C# 知識點集錦(三)併發例子集錦
阿新 • • 發佈:2020-12-01
一。使用併發的泛型方法
static async Task<T> DelayResult<T>(T result,TimeSpan delay) { await Task.Delay(delay); return result; }
如何呼叫,點選按鈕,更新文字。
private async void button1_Click(object sender, EventArgs e) { this.label1.Text = awaitView CodeDelayResult<string>("OK", TimeSpan.FromSeconds(5)); }
二。指數退避使用HttpClient訪問
static async Task<string> DownloadStringWithRetries(string uri) { using (var client =new HttpClient()) { var nextDelay = TimeSpan.FromSeconds(1View Code); for(int i=0;i!=3;++i) { try { return await client.GetStringAsync(uri); } catch (Exception) { }await Task.Delay(nextDelay); nextDelay = nextDelay +nextDelay; } return await client.GetStringAsync(uri); } }
另外一種超時機制使用Task.WhenAny
private async Task<string> DownloadStringWithTimeout(string uri) { using(var client=new HttpClient()) { var downloadTask = client.GetStringAsync(uri); var timeoutTask = Task.Delay(2000); var completedTask = await Task.WhenAny(downloadTask, timeoutTask); if (completedTask == timeoutTask) return null; return await downloadTask; } }View Code