亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

等待所有或任意異步任務完成,以及異步任務完成時的處理方案

2019-11-14 14:11:16
字體:
來源:轉載
供稿:網友

 

本篇體驗如何等待所有異步任務完成、等待任意一個異步任務完成,以及異步任務完成時的處理。

 

等待一組任務的完成使用Task.WhenAll方法。

 

Task task1 = Task.Delay(TimeSpan.FromSeconds(1));
Task task2 = Task.Delay(TimeSpan.FromSeconds(2));
Task task3 = Task.Delay(TimeSpan.FromSeconds(3));
await Task.WhenAll(task1, task2, task3);

 

如果所有任務的結果類型相同且全部完成,Task.WhenAll返回每個任務執行結果的數組。

 

Task task1 = Task.FromResult(1);
Task task2 = Task.FromResult(2);
Task task3 = Task.FromResult(3);
int[] results = await Task.WhenAll(task1, task2, task3);
foreach(var item in results)
{
    Console.WriteLine(item);
}

 

舉個例子,提供一個url的集合,要求根據這個url集合去遠程下載對應的內容,寫一個方法。

 

static async Task<string> DownloadAllAsync(IEnumerable<string> urls)
{
    var httpClient = new HttpClient();
    //定義每一個ulr的使用方法
    var downloads = urls.Select(url => httpClient.GetStringAsync(url));
    //下載真正開始
    Task<string>[] downloadTasks = downloads.ToArray();
    //異步等待
    string[] hmtls = await Task.WhenAll(downloadTasks);
    return string.Concat(htmls);
}

 

如果在等待所有任務完成的過程中有異常發生怎么辦呢?

 

如果想在等待過程中捕獲異常,那么應該把WhenAll方法放在try語句塊中;如果想在所有任務完成后捕獲異常,那就應該把WhenAll方法返回的Task類型放在try語句塊中。

 

先模擬兩個異步異常。

 

static async Task ThrowNotImplementedExceptionAsync()
{
    throw new NotImplementedException();
}
static async Task ThrowInvalidOperationExceptionAsync()
{
    throw new InvalidOperationException();
}

 

首先來看等待結果出來時的異常處理。

 

stati async Task ObserveOneExceptionAsync()
{
    var task1 = ThrowNotImplementedExceptionAsync();
    var task2 = ThrwoInvalidOperationExceptionAsync();
    try
    {
        await Task.WhenAll(task1, ask2);
    }
    cach(Exception ex)
    {
    }
}

 

再來看等所有結果出來后的異常處理。

 

static async Task ObserveAllExceptionAsync()
{
    var task1 = ThrowNotImplementedExceptionAsync();
    var task2 = ThrwoInvalidOperationExceptionAsync();
    Task allTasks = Task.WhenAll(task1, task2);
    try
    {
        await allTasks;
    }
    catch(Eexception ex)
    {
    }
}

 

等待任意一個任務的完成使用WhenAny方法。

 

比如有2個任務,通過2個url獲取異步遠程內容。

 

PRivate static async Task<int> DownloadAsync(string url1, url2)
{
    var httpClient = new HttpClient();
    Task<byte[]> download1 = httpClient.GetByteArrayAsync(url1);
    Task<byte[]> download2 = httpClient.GetByteArrayAsync(url2);
    //等待任意一個任務完成
    Task<byte[]> completedTask = await Task.WhenAny(download1, download2);
    byte[] data = await completedTask;
    return data.Length;
}

 

任務完成時如何處理呢?

 

思路有2個,一個是根據我們安排的順序出結果,還有一個是根據任務本身出結果的先后順序自然輸出結果。

 

首先來一個異步方法。

 

static async Task<int> DelayAsync(int val)
{
    await Task.Delay(TimeSpan.FromSeconds(val));
    return val;
}

 

再寫一個手動部署任務順序的方法。

 

static async Task ProcessTasksAsync()
{
    //創建任務隊列
    Task<int> task1 = DelayAsync(2);
    Task<int> task2 = DelayAsync(3);
    Task<int> task3 = DelayAsync(1);
    //手動安排任務的順序
    var tasks = new[]{task1, task2, task3};
    //按順序遍歷任務列表,逐一輸出結果
    foreach(var task in tasks)
    {
        var result = await task;
        Console.Write(result);
    }
}

 

輸出結果為231,是根據我們手動安排任務的順序輸出結果的。

 

如果我們想輸出123呢?即按照任務的不同讓結果自然發生。

 

思路是:以異步的方式處理輸出結果。

 

可以寫一個針對每個任務的異步方法。

 

static async Task AwaitAndProessAync(Task<int> task)
{
    var result = await task;
    Console.Write(result);
}

 

現在修改ProcessTasksAsync方法如下:

 

static async Task ProcessTasksAsync()
{
    //創建任務隊列
    Task<int> task1 = DelayAsync(2);
    Task<int> task2 = DelayAsync(3);
    Task<int> task3 = DelayAsync(1);
    //手動安排任務的順序
    var tasks = new[]{task1, task2, task3};
    var processingTasks = (from t in tasks
                        select AwaitAndProessAync(t)).ToArray();
     await Task.WhenAll(processingTasks);                    
}

 

當然,也可以這樣修改ProcessTasksAsync方法。


static async Task ProcessTasksAsync()
{
    //創建任務隊列
    Task<int> task1 = DelayAsync(2);
    Task<int> task2 = DelayAsync(3);
    Task<int> task3 = DelayAsync(1);
    //手動安排任務的順序
    var tasks = new[]{task1, task2, task3};
    var processingTasks = tasks.Select( async t => {
        var result = await t;
        Console.Write(result);
    }).ToArray();
                        
     await Task.WhenAll(processingTasks);                    
}

 

參考資料:C#并發編程經典實例


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲第一区在线| 日韩有码在线电影| 亚洲第一网中文字幕| 久久免费视频观看| 色婷婷综合久久久久中文字幕1| 97在线精品国自产拍中文| 国产精品第一第二| 中日韩美女免费视频网址在线观看| 精品久久久久久久久久ntr影视| 亚洲人免费视频| 最近2019中文免费高清视频观看www99| 欧美激情精品在线| 欧美成年人视频网站欧美| 91高清视频免费| 国产91在线视频| 91美女片黄在线观| 国产免费一区二区三区香蕉精| 亚洲精品视频在线观看视频| 亚洲自拍小视频| 国产精品视频免费观看www| 性欧美暴力猛交69hd| 精品国内自产拍在线观看| 最近2019年好看中文字幕视频| 97久久国产精品| 狠狠躁夜夜躁人人爽天天天天97| 成人国产精品久久久久久亚洲| 国产女人精品视频| 98午夜经典影视| 精品亚洲aⅴ在线观看| 日韩美女写真福利在线观看| 日韩av在线免播放器| 亚洲香蕉伊综合在人在线视看| 国模极品一区二区三区| 懂色aⅴ精品一区二区三区蜜月| 91po在线观看91精品国产性色| 色综合久久久888| 欧美日韩精品在线播放| 欧美激情精品久久久久久黑人| 91精品国产亚洲| 久久亚洲综合国产精品99麻豆精品福利| 自拍偷拍免费精品| 精品香蕉在线观看视频一| 欧美日韩国产一区二区| 久久香蕉国产线看观看网| 欧美区在线播放| 日韩高清电影免费观看完整| 成人久久久久久久| 久久琪琪电影院| 国产亚洲精品成人av久久ww| 亚洲美女在线看| 在线亚洲午夜片av大片| 亚洲激情免费观看| 久久久久久久色| 亚洲欧美国产日韩天堂区| 欧美大成色www永久网站婷| 黑人精品xxx一区一二区| 91精品国产综合久久香蕉的用户体验| 亚洲jizzjizz日本少妇| 97国产精品久久| 海角国产乱辈乱精品视频| 日韩亚洲欧美中文在线| 精品国产1区2区| 欧美福利在线观看| 亚洲tv在线观看| 久久久之久亚州精品露出| 欧美中文字幕在线播放| 精品美女国产在线| 亚洲欧美另类国产| 91亚洲午夜在线| 国产男女猛烈无遮挡91| 亚洲欧美日韩精品久久奇米色影视| 成人免费网站在线看| 1769国内精品视频在线播放| 一个人www欧美| 免费不卡在线观看av| 国产主播精品在线| 精品无人区太爽高潮在线播放| 欧美激情xxxxx| 午夜精品久久久久久久久久久久久| 亚洲国产精品热久久| 欧美激情一级精品国产| 日韩视频在线免费观看| 人人爽久久涩噜噜噜网站| 91性高湖久久久久久久久_久久99| 97福利一区二区| 亚洲福利视频网站| 国产精品网站大全| 国产精品va在线播放我和闺蜜| 亚洲欧美日韩国产成人| 青青草99啪国产免费| 亚洲欧美制服第一页| 久久夜精品va视频免费观看| 国产69精品久久久久9999| 亚洲第一中文字幕在线观看| 亚洲美女精品久久| 国产精品影院在线观看| 亚洲午夜色婷婷在线| 国产精品激情av在线播放| 国产精品久久久精品| 一本大道久久加勒比香蕉| 中文字幕亚洲欧美日韩高清| 日韩中文字幕国产| 日韩欧美亚洲一二三区| 国产精品人人做人人爽| 久久视频在线播放| 久久久欧美一区二区| 欧美色视频日本版| 中文字幕一精品亚洲无线一区| 久久久久久久久综合| 国产精品久久999| 亚洲最新av在线| 久久中文字幕在线| 5278欧美一区二区三区| 日韩电影大全免费观看2023年上| 97超级碰碰人国产在线观看| 中文字幕国产精品久久| 国产日产亚洲精品| 欧美性xxxx极品hd欧美风情| 另类图片亚洲另类| 日韩av手机在线| 国产精品美女在线| 久久天天躁日日躁| 在线观看久久av| 社区色欧美激情 | 97色在线观看免费视频| 国产精品高潮呻吟久久av无限| www.久久撸.com| 国产日韩精品在线观看| 91精品91久久久久久| 欧美激情视频在线观看| 日韩电影免费在线观看| 欧美国产第一页| 国产日韩欧美在线看| zzjj国产精品一区二区| 亚洲欧美激情在线视频| 国产精品美女主播| 欧美日在线观看| 欧美一级大片在线观看| 国产欧美va欧美va香蕉在线| 日本在线观看天堂男亚洲| 2019亚洲日韩新视频| 91中文字幕在线观看| 一区二区三区回区在观看免费视频| 成人免费在线视频网站| 色无极亚洲影院| 日本成人精品在线| 伊是香蕉大人久久| 国产主播喷水一区二区| 亚洲成人av片| 亚洲国产欧美在线成人app| 国产97免费视| 欧洲成人免费aa| 日韩电影免费在线观看中文字幕| 97av在线视频免费播放| 最新国产成人av网站网址麻豆| 国产精品极品美女粉嫩高清在线| 国产精品69久久| 亚洲国产成人精品一区二区| 国产成人涩涩涩视频在线观看| 亚洲成人网在线| 久久久久久久网站| 国内精品模特av私拍在线观看| 日韩视频免费大全中文字幕| 日本精品在线视频|