日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C#多線程TPL常見操作誤區與異常處理_C#教程

作者:.NET開發菜鳥 ? 更新時間: 2022-05-24 編程語言

一、一定要async到底

一定要讓async的傳染性(調用異步方法要用await,用了await的方法就要聲明為async,調用我這個async方法的地方必須要await.....)不要輕易直接調用Task的Wait、WaitAll等方法。等待一個用await,而不是task.Wait();等待多個用await Task.WhenAll(),而不是Task.WaitAll()。

二、用了異步性能不一定高

程序里面使用了異步不一定說性能就一定高,下面的異步方法就沒有意義:

public async Task GetAsync()
{
    return await Task.Run(() => 
    {
        using (WebClient client = new WebClient())
        {
            // 這里使用的是同步方法,所以該異步方法沒有意義
            return client.DownloadString("http://www.baidu.com");
        }
    });
}

Task里面還是調用的同步方法,這樣就沒有意義了。

用了異步之后能用異步API就用異步API,只使用await、WhenAll,不要使用task.Result、Wait()。

ADO.NET、IO、EF等都提供了異步的API。

TPL中的異常處理

1、TPL中,如果程序中出現異常,除非使用try...catch進行捕獲異常,否則有呢能會感覺不到出現了異常。

2、TPL程序有時候還會拋出AggregateException,這通常發生在并行有多個任務執行的情況下,因為多個并行的任務可能會發生多個異常,因此會包裝為AggregateException異常,AggregateException的InnerExceptions屬性可以獲得多個異常對象的信息,看下面的代碼:

private void button1_Click(object sender, EventArgs e)
{
    try
    {
        HttpClient hc = new HttpClient();
        // 存在的url地址
        string url1 = "http://www.baidu.com";
        // 不存在的url地址
        string url2 = "http://www.121qwqwqw.com";
        string url3 = "http://www.7546456dfsdf.com";
        var task1 = hc.GetStringAsync(url1);
        var task2 = hc.GetStringAsync(url2);
        var task3 = hc.GetStringAsync(url3);
        // 并行執行三個任務
        Task.WaitAll(task1, task2, task3);
        MessageBox.Show("下載成功");
       
    }
    catch (AggregateException ae)
    {
        // 循環遍歷輸出異常信息
        foreach (var item in ae.InnerExceptions)
        {
            MessageBox.Show(item.Message);
        }
    }
}

運行程序的時候,就會循環輸出多個異常信息。

原文鏈接:https://www.cnblogs.com/dotnet261010/p/12345740.html

欄目分類
最近更新