How to: 执行Action当收到数据时
本文旨在演示ActionBlock的使用。
大致流程:
输入路径——读取字节——计算——传输到打印
- // Demonstrates how to provide delegates to exectution dataflow blocks.
- class DataflowExecutionBlocks
- {
- // 计算文件中包含零字节的总数
- static
int CountBytes(string path) - {
- byte[] buffer = new
byte[1024]; - int totalZeroBytesRead = 0;
- using (var fileStream = File.OpenRead(path))
- {
- int bytesRead = 0;
- do
- {
- bytesRead = fileStream.Read(buffer, 0, buffer.Length);
- totalZeroBytesRead += buffer.Count(b => b == 0);
- } while (bytesRead > 0);
- }
- return totalZeroBytesRead;
- }
- static
void Run(string[] args) - {
- // 创建一个临时目录
- string tempFile = Path.GetTempFileName();
- // 随机写入数据
- using (var fileStream = File.OpenWrite(tempFile))
- {
- Random rand = new Random();
- byte[] buffer = new
byte[1024]; - for (int i = 0; i < 512; i++)
- {
- rand.NextBytes(buffer);
- fileStream.Write(buffer, 0, buffer.Length);
- }
- }
- // 创建一个ActionBlock<int> 对象来打印 读取到的字节数
- var printResult = new ActionBlock<int>(zeroBytesRead =>
- {
- Console.WriteLine("{0} contains {1} zero bytes.",
- Path.GetFileName(tempFile), zeroBytesRead);
- });
- // 创基一个 TransformBlock<string, int>对象来调用CountBytes函数,并返回计算结果
- var countBytes = new TransformBlock<string, int>(
- new Func<string, int>(CountBytes));
- // 将两个块链接起来:TranformBlock<string,int>对象和ActionBlock对象。
- countBytes.LinkTo(printResult);
- // 创建一个连续任务:当TransformBlock<string, int>完成时,通知打印结果已完成
- countBytes.Completion.ContinueWith(delegate { printResult.Complete(); });
- // 输入临时目录
- countBytes.Post(tempFile);
- // 标识结束
- countBytes.Complete();
- // 等待打印完成
- printResult.Completion.Wait();
- File.Delete(tempFile);
- }
- }
TransformBlock:一般用作传输和计算。类似函数式编程中的Map操作。
Func<TInput,TOutput>委托,通过Post,输入一个TInput参数。
Complete(),表明已完成
Completion任务,完成之后,当前任务结束。本质上来讲,TranformBlock运行在一个Task中。
ActionBlock:
Action<TInput> action委托,单一输入,执行诸如打印之类的操作。
同样也有Complete()和Completion任务。
同时,以上两个均支持异步方法:
Transform
Action
- var countBytesAsync = new TransformBlock<string, int>(async path =>
- {
- byte[] buffer = new
byte[1024]; - int totalZeroBytesRead = 0;
- using (var fileStream = new FileStream(
- path, FileMode.Open, FileAccess.Read, FileShare.Read, 0x1000, true))
- {
- int bytesRead = 0;
- do
- {
- // Asynchronously read from the file stream.
- bytesRead = await fileStream.ReadAsync(buffer, 0, buffer.Length);
- totalZeroBytesRead += buffer.Count(b => b == 0);
- } while (bytesRead > 0);
- }
- return totalZeroBytesRead;
- });
How to: 执行Action当收到数据时的更多相关文章
- Mysql Workbench 执行sql语句删除数据时提示error code 1175
error code 1175是因为有安全模式限制 执行命令SET SQL_SAFE_UPDATES = 0;之后可以进行操作
- ajax跨域往php程序post数据时,php程序总是执行两次的解决方法
php程序是部署在IIS7上面,ajax提交数据时,遇到了两个问题,一个就是跨域,一个php程序总会被执行两次. 第一个问题的解决方法,是百度出来的,添加下面几行代码就可以了: header('Acc ...
- SqlBulkCopy批量插入数据时,不执行触发器和约束的解决方法
原文:SqlBulkCopy批量插入数据时,不执行触发器和约束的解决方法 在new SqlBulkCopy对象的时候,设置一下SqlBulkCopyOptions选项即可,按位或运算 SqlBulkC ...
- 【转】使用TCP协议连续传输大量数据时,是否会丢包,应如何避免?
使用TCP协议连续传输大量数据时,是否会丢包,应如何避免? 比如发送文件.记得有人提过可能会发生什么堆栈溢出.怎样避免呢?是不是可以收到数据后发送确认包,收到确认包后再继续发送.或是发送方发送了一些数 ...
- .net 中异步SOCKET发送数据时碰到的内存问题
做CS的开发一直都是这样的方式: server端用 C++编写,采用IOCP机制处理大量客户端连接.数据接收发送的问题 client端用 C++ 或C# 写,没什么特殊要求. 最近工作时间上比较宽裕, ...
- MySQL实战 | 01-当执行一条 select 语句时,MySQL 到底做了啥?
原文链接:当执行一条 select 语句时,MySQL 到底做了啥? 也许,你也跟我一样,在遇到数据库问题时,总时茫然失措,想重启解决问题,又怕导致数据丢失,更怕重启失败,影响业务. 就算重启成功了, ...
- python2读取EXCEL表格内的数据时碰到的问题
一,今天在剥离自动化的测试数据时,发生了一个错误,错误显示读取不到某个单元格的数据. 因为我使用的是python2,正好那一个单元格出现的是中文汉字,再者通过查看报错日志,让我了解到错误的原因. di ...
- [转]javascript eval函数解析json数据时为什加上圆括号eval("("+data+")")
javascript eval函数解析json数据时为什么 加上圆括号?为什么要 eval这里要添加 “("("+data+")");//”呢? 原因在于: ...
- 解决SQLSERVER在还原数据时出现的“FILESTREAM功能被禁用”问题
解决SQLSERVER在还原数据时出现的“FILESTREAM功能被禁用”问题 今天由于测试需要,在网上下载了Adventureworks2008实例数据库的BAK文件,进行还原时出现了这样的错误“F ...
随机推荐
- HTML认识
1.1 认识什么是纯文本文件 txt window自带有一个软件,叫做记事本,记事本保存的格式TXT,就是英文text的缩写,术语上称呼为"纯文本文件" TXT文件,只能保存文本内 ...
- Java发送邮件初窥
一.背景 最近朋友的公司有用到这个功能,之前对这一块也不是很熟悉,就和他一起解决出现的异常的同时,也初窥一下使用Apache Common Email组件进行邮件发送. 二.Java发送邮件的注意事项 ...
- ios创建二维码
#import "LCTwoCodeImage.h" @implementation LCTwoCodeImage +(UIImage *) GotoCreatMyTwoCode ...
- 利用颜色生成UIImage
// 颜色转换为背景图片 + (UIImage *)imageWithColor:(UIColor *)color { CGRect rect = CGRectMake(0.0f, 0.0f, 1. ...
- poj1308(简单并查集)
题目链接:http://poj.org/problem?id=1308 题意:x, y 表示x 与 y连接,给出一波这样的数据,问这组数据能否构成树,即不能形成回路,不能有多个根节点:要注意可以是空树 ...
- CodeForces 282C(位运算)
C. XOR and OR time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...
- 转:不再以讹传讹,GET和POST的真正区别
如果有人问你,GET和POST,有什么区别?你会如何回答? 我的经历 前几天有人问我这个问题.我说GET是用于获取数据的,POST,一般用于将数据发给服务器之用. 这个答案好像并不是他想要的.于是他继 ...
- JAVA一些常用的时间操作
项目中经常有对时间进行处理的需求,下面是一些常用的操作整理,方便以后再次使用以及做相关复习. 1.字符串转换为日期 /** * 字符串转换为日期 * @param dateStr 需要转换的日期 * ...
- mysql 5.6.33 重置密码后报错
[root@ Desktop]# mysql -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with ; o ...
- Android中Service 使用详解(LocalService + RemoteService)
Service 简介: Service分为本地服务(LocalService)和远程服务(RemoteService): 1.本地服务依附在主进程上而不是独立的进程,这样在一定程度上节约了资源,另外L ...