最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2013年05月13日 16:22:52   作者:  
本篇文章是對使用enumerator模式簡化異步操作進行了詳細的分析介紹,需要的朋友參考下

先看一段同步代碼:

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,然后進行統(tǒng)計。

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

我以前演示過一段丑陋的代碼大致如下:
 
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 的地址"));

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

如何使用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 ,可以實現(xiàn)異步調(diào)用A->異步調(diào)用B->異步調(diào)用C..的方式。
首先解釋下為什么可以,假設uris 有A,B,C.

SumPageSizesAsyncHelper(uris.GetEnumerator(), 0);

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

image

 

image


如果使用async 和await來實現(xiàn)的話,代碼如下:

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}:調(diào)用{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;
}

相關文章

  • C#基礎教程之IComparable用法,實現(xiàn)List<T>.sort()排序

    C#基礎教程之IComparable用法,實現(xiàn)List<T>.sort()排序

    這篇文章主要介紹了C#的一些基礎知識,主要是IComparable用法,實現(xiàn)List<T>.sort()排序,非常的實用,這里推薦給大家。
    2015-02-02
  • C#讀取計算機CPU及HDD信息的方法

    C#讀取計算機CPU及HDD信息的方法

    這篇文章主要介紹了C#讀取計算機CPU及HDD信息的方法,涉及C#讀取計算機CPU及硬盤信息的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • 如何用.NETCore操作RabbitMQ

    如何用.NETCore操作RabbitMQ

    這篇文章主要介紹了如何用.NETCore操作RabbitMQ,對中間件感興趣的同學,可以參考下
    2021-05-05
  • C#中List和SortedList的簡介

    C#中List和SortedList的簡介

    今天小編就為大家分享一篇關于C#中List和SortedList的簡介,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • C#與C++與互操作實例講解

    C#與C++與互操作實例講解

    在本篇文章里小編給大家整理了關于C#與C++與互操作實例以及相關內(nèi)容,需要的朋友們可以學習下。
    2019-08-08
  • C# CheckedListBox控件的用法總結

    C# CheckedListBox控件的用法總結

    本篇文章主要介紹了C# CheckedListBox控件的用法總結,想要學習CheckedListBox的同學可以了解一下。
    2016-12-12
  • C#利用SFTP實現(xiàn)上傳下載

    C#利用SFTP實現(xiàn)上傳下載

    這篇文章主要為大家詳細介紹了C#利用SFTP實現(xiàn)上傳下載的相關代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • 基于C#實現(xiàn)PDF按頁分割文件和分頁合并

    基于C#實現(xiàn)PDF按頁分割文件和分頁合并

    iTextSharp 是一個開源的 PDF 處理庫,用于在 C# 程序中創(chuàng)建、編輯和處理 PDF 文件,本文將使用iTextSharp實現(xiàn)C# PDF分割與合并,感興趣的可以了解下
    2025-03-03
  • C#實現(xiàn)將漢字轉化為2位大寫的16進制Unicode的方法

    C#實現(xiàn)將漢字轉化為2位大寫的16進制Unicode的方法

    這篇文章主要介紹了C#實現(xiàn)將漢字轉化為2位大寫的16進制Unicode的方法,分析了轉換的技巧并以實例形式給出了具體的轉換方法,非常具有實用價值,需要的朋友可以參考下
    2014-12-12
  • Base64編碼解碼原理及C#編程實例

    Base64編碼解碼原理及C#編程實例

    這篇文章主要介紹了Base64編碼解碼原理及C#編程實例,本文講解了Base64編碼由來、Base64編碼原理、C#編程實現(xiàn),需要的朋友可以參考下
    2014-10-10

最新評論

青河县| 新建县| 长顺县| 福州市| 仪征市| 瑞安市| 广丰县| 荃湾区| 施甸县| 汽车| 绥德县| 子长县| 汉沽区| 琼海市| 蚌埠市| 鄯善县| 津市市| 平山县| 台江县| 汝城县| 南开区| 无锡市| 苍梧县| 屏东市| 霞浦县| 铅山县| 乐昌市| 涿鹿县| 农安县| 寿光市| 陆川县| 遂宁市| 楚雄市| 屯留县| 泾源县| 陵川县| 循化| 尉氏县| 韶山市| 随州市| 山东省|