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

首頁 > 編程 > C# > 正文

解析使用enumerator模式簡化異步操作的詳解

2020-01-24 03:21:12
字體:
來源:轉載
供稿:網友

先看一段同步代碼:

public int SumPageSizes(IList<Uri> uris) {
    int total = 0;
    foreach (var uri in uris) {
        statusText.Text = string.Format("Found {0} bytes ...", total);
        var data = new WebClient().DownloadData(uri);
        total += data.Length;
    }
    statusText.Text = string.Format("Found {0} bytes total", total);
    return total;
}
這段代碼比較簡單,使用同步方式一個一個的獲取Uri的Data,然后進行統計。

如果要使用異步方式一個一個的統計,那應該如何計算呢?

我以前演示過一段丑陋的代碼大致如下:
 
WebClient webClient = new WebClient();
 webClient.DownloadDataCompleted += (s, e) =>
 {
     // 使用A對象,做些事情。
     WebClient webClient2 = new WebClient();
     webClient2.DownloadDataCompleted += (s2, e2) =>
     {
         //使用B對象,做些事情。
        // 遞歸的去 DownloadDataAsync。
     };
     webClient2.DownloadDataAsync(new Uri("B 的地址"));
 };
 webClient.DownloadDataAsync(new Uri("A 的地址"));

當然如果你確定只有兩個地址的話,這種方法未嘗不可。如果有多個地址的話,則必須遞歸的調用了。

如何使用Enumerator來簡化異步操作:

public void SumPageSizesAsync(IList<Uri> uris) {
    SumPageSizesAsyncHelper(uris.GetEnumerator(), 0);
}
private void SumPageSizesAsyncHelper(IEnumerator<Uri> enumerator, int total) {
    if (enumerator.MoveNext()) {
        statusText.Text = string.Format("Found {0} bytes ...", total);
        var client = new WebClient();
        client.DownloadDataCompleted += (sender, e) => {
            SumPageSizesAsyncHelper(enumerator, total + e.Result.Length);
        };
        client.DownloadDataAsync(enumerator.Current);
    }
    else {
        statusText.Text = string.Format("Found {0} bytes total", total);
        enumerator.Dispose();
    }
}

通過SumPageSizesAsyncHelper ,可以實現異步調用A->異步調用B->異步調用C..的方式。
首先解釋下為什么可以,假設uris 有A,B,C.

SumPageSizesAsyncHelper(uris.GetEnumerator(), 0);

方法先調用A,因為A后面還有B,所以enumerator.MoveNext()返回True,
接著在DownloadDataCompleted事件結束后,調用B,同樣,因為B后面還有C,
所以enumerator.MoveNext() 繼續返回True,接著在DownloadDataCompleted事件后調用C。
在調用C結束后,因為C后面沒有了,所以enumerator.MoveNext() 返回False,
也可以認為全部都下載完畢了。所以返回最終的結果。

image

 

image


如果使用async 和await來實現的話,代碼如下:

public async Task<int> SumPageSizesAsync2(IList<Uri> uris)
{
    int total = 0;
    Char charText = 'A';
    foreach (var uri in uris)
    {
       var data = await new WebClient().DownloadDataTaskAsync(uri);
        total += data.Length;
        Console.WriteLine("Thread Id: {0}:調用{1}的地址 Found {2} bytes...{3}",
            Thread.CurrentThread.ManagedThreadId, charText, total, DateTime.Now);
        charText = Convert.ToChar(charText + 1);
    }
    Console.WriteLine("Thread Id: {0}:全部完成,Found {1} bytes total {2}",
        Thread.CurrentThread.ManagedThreadId, total, DateTime.Now);
    return total;
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品日韩欧美综合| 国产亚洲aⅴaaaaaa毛片| 久久国产精彩视频| 国产剧情日韩欧美| 精品国模在线视频| xxxx性欧美| 久久91精品国产91久久久| 亚洲精品久久久久久久久久久久久| 97国产真实伦对白精彩视频8| 亚洲成人免费网站| 亚洲精品福利视频| 久久久亚洲精品视频| 欧美日韩亚洲一区二区三区| 中文字幕久久久av一区| 亚洲级视频在线观看免费1级| 亚洲视频专区在线| 欧美巨猛xxxx猛交黑人97人| 自拍偷拍亚洲欧美| 久久精品精品电影网| 国产精品igao视频| 欧美在线视频播放| 日韩视频在线免费观看| 成人免费视频a| 久久久久国产精品www| 久久精品亚洲一区| 国产福利视频一区| 青青久久av北条麻妃海外网| 亚洲欧美日韩一区二区在线| 欧美色道久久88综合亚洲精品| 亚洲免费视频一区二区| 97久久精品人人澡人人爽缅北| 色中色综合影院手机版在线观看| 国产精品揄拍一区二区| 日韩av免费看网站| 亚洲天堂视频在线观看| 18一19gay欧美视频网站| 91禁外国网站| 久久精品中文字幕免费mv| 欧美国产日韩一区| 国外色69视频在线观看| 欧美午夜久久久| 色婷婷亚洲mv天堂mv在影片| xxx欧美精品| 性欧美办公室18xxxxhd| 亚洲综合中文字幕68页| 亚洲视频在线观看| 国产中文日韩欧美| 国产亚洲人成a一在线v站| www国产精品视频| 国产剧情久久久久久| 色综合五月天导航| 久久久久久亚洲精品不卡| 亚洲欧洲一区二区三区在线观看| 国产精品白嫩初高中害羞小美女| 狠狠色狠狠色综合日日五| 国产精品久久久久久久久久| 欧美在线视频观看| 中文综合在线观看| 久久久在线免费观看| 欧美精品久久久久久久久| 中文字幕欧美精品日韩中文字幕| 日韩人体视频一二区| 亚洲欧美日韩国产成人| 亚洲一区二区三区视频| 欧美精品亚州精品| 国产精品久久久久久久一区探花| 国产精品久久久久久av福利| 欧美性一区二区三区| 国产自摸综合网| 国内精品中文字幕| 午夜欧美不卡精品aaaaa| 热久久免费视频精品| 久久久www成人免费精品| 日韩在线播放一区| 欧美成人精品不卡视频在线观看| 日韩欧美国产黄色| 国产视频精品一区二区三区| 亚洲人成网站777色婷婷| 成人黄色免费在线观看| 久久久人成影片一区二区三区观看| 久久国产精品影视| 日本人成精品视频在线| 久久国产精品偷| 欧美另类老肥妇| 亚洲一区免费网站| 国内精品久久久久伊人av| 亚洲第一免费网站| 日韩欧美在线视频免费观看| 欧美日韩国产91| 日韩暖暖在线视频| 亚洲激情久久久| 亚洲欧美制服中文字幕| 亚洲精品www久久久久久广东| 北条麻妃一区二区在线观看| 国产v综合ⅴ日韩v欧美大片| 久久久午夜视频| 久久av红桃一区二区小说| 色吧影院999| 亚洲国产成人精品电影| 欧美日韩xxx| 亚洲精品日韩在线| 91综合免费在线| 91亚洲精品在线观看| 国产亚洲精品久久| 2019国产精品自在线拍国产不卡| 欧美精品免费在线观看| 国产精品入口夜色视频大尺度| 俺也去精品视频在线观看| 欧美日韩一区二区精品| 国产成人精品在线观看| 91网在线免费观看| 国产精品va在线| 亚洲天堂久久av| 久久精品国产亚洲精品| 亚洲曰本av电影| 国产伦精品免费视频| 欧美日韩加勒比精品一区| 国产精品久久久久久久天堂| 蜜臀久久99精品久久久无需会员| 亚洲国产精品久久| 欧美成人剧情片在线观看| 亚洲国产精品一区二区久| 国产69久久精品成人看| 亚洲福利在线观看| 欧美乱大交做爰xxxⅹ性3| 亚洲国产精品女人久久久| 国产欧美日韩精品专区| 欧美一级高清免费| 欧美黑人一区二区三区| 国产亚洲欧洲在线| 中文字幕最新精品| 97欧美精品一区二区三区| 亚洲精品动漫100p| 91av在线免费观看视频| 日韩女优人人人人射在线视频| 成人国产精品久久久久久亚洲| 亚洲3p在线观看| 亚洲男人天堂2019| 国内自拍欧美激情| 国产精品九九九| 91精品国产乱码久久久久久蜜臀| 亚洲国产日韩欧美在线动漫| 成人精品aaaa网站| 国产精品激情自拍| 久久久精品一区| 成人福利网站在线观看| 亚洲一区二区少妇| 日韩视频免费大全中文字幕| 国产精品自拍网| 国产精品69久久| 一区二区三区黄色| 国产精品久久久久久av福利软件| 国产成人精品av| 国产精品成av人在线视午夜片| 亚洲丁香婷深爱综合| 国产成人精品久久亚洲高清不卡| 久久这里只有精品视频首页| 欧美孕妇毛茸茸xxxx| 91久久在线观看| 国产一区深夜福利| 高跟丝袜一区二区三区| 日韩电影在线观看永久视频免费网站| 免费成人高清视频| 国产精品日韩av|