1. 程式人生 > 實用技巧 >C# 知識點集錦(三)併發例子集錦

C# 知識點集錦(三)併發例子集錦

一。使用併發的泛型方法

        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 = await
DelayResult<string>("OK", TimeSpan.FromSeconds(5)); }
View Code

二。指數退避使用HttpClient訪問

        static async Task<string> DownloadStringWithRetries(string uri)
        {
            using (var client =new HttpClient())
            {
                var nextDelay = TimeSpan.FromSeconds(1
); 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); } }
View Code

另外一種超時機制使用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