本文旨在演示ActionBlock的使用。

大致流程:

输入路径——读取字节——计算——传输到打印

 

  1. // Demonstrates how to provide delegates to exectution dataflow blocks.
  2. class DataflowExecutionBlocks
  3. {
  4.     // 计算文件中包含零字节的总数
  5.     static
    int CountBytes(string path)
  6.     {
  7.         byte[] buffer = new
    byte[1024];
  8.         int totalZeroBytesRead = 0;
  9.         using (var fileStream = File.OpenRead(path))
  10.         {
  11.             int bytesRead = 0;
  12.             do
  13.             {
  14.                 bytesRead = fileStream.Read(buffer, 0, buffer.Length);
  15.                 totalZeroBytesRead += buffer.Count(b => b == 0);
  16.             } while (bytesRead > 0);
  17.         }
  18.  
  19.         return totalZeroBytesRead;
  20.     }
  21.  
  22.     static
    void Run(string[] args)
  23.     {
  24.         // 创建一个临时目录
  25.         string tempFile = Path.GetTempFileName();
  26.  
  27.         // 随机写入数据
  28.         using (var fileStream = File.OpenWrite(tempFile))
  29.         {
  30.             Random rand = new Random();
  31.             byte[] buffer = new
    byte[1024];
  32.             for (int i = 0; i < 512; i++)
  33.             {
  34.                 rand.NextBytes(buffer);
  35.                 fileStream.Write(buffer, 0, buffer.Length);
  36.             }
  37.         }
  38.  
  39.         // 创建一个ActionBlock<int> 对象来打印 读取到的字节数
  40.         var printResult = new ActionBlock<int>(zeroBytesRead =>
  41.         {
  42.             Console.WriteLine("{0} contains {1} zero bytes.",
  43.                 Path.GetFileName(tempFile), zeroBytesRead);
  44.         });
  45.  
  46.         // 创基一个 TransformBlock<string, int>对象来调用CountBytes函数,并返回计算结果
  47.         var countBytes = new TransformBlock<string, int>(
  48.             new Func<string, int>(CountBytes));
  49.  
  50.         // 将两个块链接起来:TranformBlock<string,int>对象和ActionBlock对象。
  51.         countBytes.LinkTo(printResult);
  52.  
  53.         // 创建一个连续任务:当TransformBlock<string, int>完成时,通知打印结果已完成
  54.         countBytes.Completion.ContinueWith(delegate { printResult.Complete(); });
  55.  
  56.         // 输入临时目录
  57.         countBytes.Post(tempFile);
  58.  
  59.         // 标识结束
  60.         countBytes.Complete();
  61.  
  62.         // 等待打印完成
  63.         printResult.Completion.Wait();
  64.  
  65.         File.Delete(tempFile);
  66.     }
  67. }

 

TransformBlock:一般用作传输和计算。类似函数式编程中的Map操作。

Func<TInput,TOutput>委托,通过Post,输入一个TInput参数。

Complete(),表明已完成

Completion任务,完成之后,当前任务结束。本质上来讲,TranformBlock运行在一个Task中。

 

ActionBlock

Action<TInput> action委托,单一输入,执行诸如打印之类的操作。

同样也有Complete()和Completion任务。

 

同时,以上两个均支持异步方法:

Transform

Action

 

  1. var countBytesAsync = new TransformBlock<string, int>(async path =>
  2. {
  3.     byte[] buffer = new
    byte[1024];
  4.     int totalZeroBytesRead = 0;
  5.     using (var fileStream = new FileStream(
  6.         path, FileMode.Open, FileAccess.Read, FileShare.Read, 0x1000, true))
  7.     {
  8.         int bytesRead = 0;
  9.         do
  10.         {
  11.             // Asynchronously read from the file stream.
  12.             bytesRead = await fileStream.ReadAsync(buffer, 0, buffer.Length);
  13.             totalZeroBytesRead += buffer.Count(b => b == 0);
  14.         } while (bytesRead > 0);
  15.     }
  16.  
  17.     return totalZeroBytesRead;
  18. });

How to: 执行Action当收到数据时的更多相关文章

  1. Mysql Workbench 执行sql语句删除数据时提示error code 1175

    error code 1175是因为有安全模式限制 执行命令SET SQL_SAFE_UPDATES = 0;之后可以进行操作

  2. ajax跨域往php程序post数据时,php程序总是执行两次的解决方法

    php程序是部署在IIS7上面,ajax提交数据时,遇到了两个问题,一个就是跨域,一个php程序总会被执行两次. 第一个问题的解决方法,是百度出来的,添加下面几行代码就可以了: header('Acc ...

  3. SqlBulkCopy批量插入数据时,不执行触发器和约束的解决方法

    原文:SqlBulkCopy批量插入数据时,不执行触发器和约束的解决方法 在new SqlBulkCopy对象的时候,设置一下SqlBulkCopyOptions选项即可,按位或运算 SqlBulkC ...

  4. 【转】使用TCP协议连续传输大量数据时,是否会丢包,应如何避免?

    使用TCP协议连续传输大量数据时,是否会丢包,应如何避免? 比如发送文件.记得有人提过可能会发生什么堆栈溢出.怎样避免呢?是不是可以收到数据后发送确认包,收到确认包后再继续发送.或是发送方发送了一些数 ...

  5. .net 中异步SOCKET发送数据时碰到的内存问题

    做CS的开发一直都是这样的方式: server端用 C++编写,采用IOCP机制处理大量客户端连接.数据接收发送的问题 client端用 C++ 或C# 写,没什么特殊要求. 最近工作时间上比较宽裕, ...

  6. MySQL实战 | 01-当执行一条 select 语句时,MySQL 到底做了啥?

    原文链接:当执行一条 select 语句时,MySQL 到底做了啥? 也许,你也跟我一样,在遇到数据库问题时,总时茫然失措,想重启解决问题,又怕导致数据丢失,更怕重启失败,影响业务. 就算重启成功了, ...

  7. python2读取EXCEL表格内的数据时碰到的问题

    一,今天在剥离自动化的测试数据时,发生了一个错误,错误显示读取不到某个单元格的数据. 因为我使用的是python2,正好那一个单元格出现的是中文汉字,再者通过查看报错日志,让我了解到错误的原因. di ...

  8. [转]javascript eval函数解析json数据时为什加上圆括号eval("("+data+")")

    javascript eval函数解析json数据时为什么 加上圆括号?为什么要 eval这里要添加 “("("+data+")");//”呢?   原因在于: ...

  9. 解决SQLSERVER在还原数据时出现的“FILESTREAM功能被禁用”问题

    解决SQLSERVER在还原数据时出现的“FILESTREAM功能被禁用”问题 今天由于测试需要,在网上下载了Adventureworks2008实例数据库的BAK文件,进行还原时出现了这样的错误“F ...

随机推荐

  1. 关于 UICollectionViewCell 的一些陷阱

    如果直接使用 UICollectionViewCell 的自带属性 selected 来自定义一些样式,如: - (void)setSelected:(BOOL)selected { [super s ...

  2. C++面向对象基础知识

    多态是为了接口重用,封装和继承是为了代码重用 子类重新定义父类虚函数的方法叫做继承,不是重载! 一.基本概念 对于C++中经常出现的函数名称相同但是参数列表或者返回值不同的函数,主要存在三种情况: 1 ...

  3. ActiveMQ的几种消息持久化机制

    为了避免意外宕机以后丢失信息,需要做到重启后可以恢复消息队列,消息系统一般都会采用持久化机制. ActiveMQ的消息持久化机制有JDBC,AMQ,KahaDB和LevelDB,无论使用哪种持久化方式 ...

  4. 【PHP自定义显示系统级别的致命错误和用户级别的错误】

    使用方法set_error_handler可以自定义用户级别的错误和系统级别的错误信息显示和处理 用户级别的错误使用trigger_error方法产生一个用户级别的错误信息 代码示例: 系统级别的错误 ...

  5. 一个简单的Promise 实现

    用了这么长时间的promise,也看了很多关于promise 的文章博客,对promise 算是些了解.但是要更深的理解promise,最好的办法还是自己实现一个. 我大概清楚promise 是对异步 ...

  6. android 入门-android Studio git配置

    以后在整理

  7. 跟着鸟哥学Linux系列笔记2-第10章VIM学习

    跟着鸟哥学Linux系列笔记0-扫盲之概念 跟着鸟哥学Linux系列笔记0-如何解决问题 跟着鸟哥学Linux系列笔记1 常用的文本编辑器:Emacs, pico, nano, joe, vim VI ...

  8. java中如何实现类似goto的作法

    goto虽然是java中保留的keyword,但是对于跳转这个语法对新手来说这个确实好用.为了提高程序的可靠性和可读性,Java语言目前是不支持无条件跳转的goto语句!! 幸亏java中有高仿跳转的 ...

  9. jquery中append()、prepend()、after()、before()的区别详解

    append() - 在被选元素的结尾插入内容(内容的结尾,比如说有个a标签,则是在</a>这个标签之前添加东西) prepend() - 在被选元素的开头插入内容(内容的开始,比如说有个 ...

  10. oc精简笔记

    首先如果是想在终端学习的话,以下内容是必须的,如果是直接使用xcode的请随意: operating system      os       X ter   终端的缩写 ls      显示目录文件 ...