• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > 解析使用enumerator模式简化异步操作的详解

解析使用enumerator模式简化异步操作的详解

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了enumerator,umbus enumerator,enumerator是什么意思,nvvhci enumerator,bluetooth enumerator等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

先看一段同步代码:

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;
}

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 解析使用enumerator模式简化异步操作的详解

相关文章

  • 2017-05-28c# 抓取Web网页数据分析
  • 2017-05-28C# XML与Json之间相互转换实例详解
  • 2017-05-28C#基础知识之this关键字介绍
  • 2017-05-28C#编程实现自定义热键的方法
  • 2017-05-28C#常用的数据格式转换汇总
  • 2017-05-28C# MVC模式中应该怎样区分应用程序逻辑(Controller层)和业务逻辑(Model层)?
  • 2017-05-28C#预处理器指令的用法实例分析
  • 2017-05-28基于XSLT调试的相关问题
  • 2017-05-28SMTP客户端未通过身份验证等多种错误解决方案分享
  • 2017-05-28C#基础知识系列八const和readonly关键字详细介绍

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C# 打开电子邮件软件的具体方法
    • 详解C#中的接口属性以及属性访问器的访问限制
    • 枚举的用法详细总结
    • C#启动和停止windows服务的实例代码
    • 深入解析C#编程中泛型委托的使用
    • C# cmd中修改显示(显示进度变化效果)的方法
    • C#实现让窗体永远在窗体最前面显示的实例
    • C# dynamic关键字的使用方法
    • 详解TreeView绑定数据库
    • C#实现验证身份证是否合法的方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有