How to: 执行Action当收到数据时

?

本文旨在演示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. });
时间: 2024-11-05 13:39:30

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

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

php程序是部署在IIS7上面,ajax提交数据时,遇到了两个问题,一个就是跨域,一个php程序总会被执行两次. 第一个问题的解决方法,是百度出来的,添加下面几行代码就可以了: header('Access-Control-Allow-Origin:*'); header("Access-Control-Allow-Headers: x-requested-with,content-type"); header('Access-Control-Allow-Methods: OPTION

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

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

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

原文链接:当执行一条 select 语句时,MySQL 到底做了啥? 也许,你也跟我一样,在遇到数据库问题时,总时茫然失措,想重启解决问题,又怕导致数据丢失,更怕重启失败,影响业务. 就算重启成功了,对于问题的原因仍不知所以. 本文开始,记录学习<MySQL实战45讲>专栏的过程. 也许有人会问,你记录有什么意义?直接看专栏不就行了吗?你这不是啃别人的剩骨头吗? 是的,这个系列,我只是基于专栏学习,但是我会尽量从我的角度搞懂每一个知识点,遇到不懂得也会将知识点进行拆分. 我知道关注公众号的小伙

SSH配置环境都正常,但是每次执行到Action中的方法时就中断了,而且不报任何错误

SSH配置环境都正常,但是每次执行到Action中的方法时就不执行课,而且不报任何错误.Action中的方法封装的是业务层,业务层封装DAO层,检查了一天才发现错误在哪. 在applicationContext.xml中报了一个异常,如: Multiple annotations found at this line: - Exception 'com/dao/StudentDAO : Unsupported major.minor version 51.0' - Exception 'com/

DB2导入数据时乱码问题

1.由于导入import导入数据时乱码,一直找不到解决办法,于是就用load导入 LOAD后,发现某些表检查挂起( 原因码为 "1",所以不允许操作 SQLSTATE=57016 ) 解决办法:set integrity for xxxxxx immediate checked 2.表锁定(原因码为7) 解决办法:reorg table xxxx 3.去重 select distinct a.column from table1 as a inner join table2 as b

nodejs向前台send数据时Date类型数据格式问题

1.现象 前端向nodejs服务器请求数据时,发现得到的返回数据中日期字段(json格式)值不熟,处理时发现有时差 从mysql中读出的时间格式 > publishtime:Sat Aug 19 2017 15:46:01 GMT+0800 (中国标准时间) 前端收到的时间格式 > "publishtime":"2017-07-16T14:46:01.000Z" "Sat Aug 19 2017 15:46:01 GMT+0800"这

mysql数据库delete数据时不支持表别名

今天在帮同事查看一条删除的SQL语句执行出错的问题 SQL语句如下: 1 DELETE FROM LEAD_SYSTEM_MENU_ORG_REF as t WHERE t.resourceid='4028812348f28b890148f29253a80000' 这条SQL语句放到Oracle数据库中去执行是可以正常执行的,但是放到MySQL数据库中执行时就出现了如下的错误: 1 [Err] 1064 - You have an error in your SQL syntax; check

struts2中action向action之间传数据和action向jsp传数据理解

1,在 Action中我们经常会从这个Action跳转到另一个Action中,这时我们就要用到redirect.redirect-action.chain, 其中redirect和redirect-action是重定向,相当于浏览器二次请求,之前的数据都会丢失,所有的参数.值栈和请求属性都会丢失.chain是服务器转发action,源Action的用户请求参数.值栈.session的数据赋值给目的Action,即在目的action中可以获得源action得到的请求参数值栈,session等数据.

Struts2初学 Struts2的action接收用户数据方式

一.简介    开发Web应用程序,首先应会遇到对用户输入数据的接收,传统的Web应用程序是由开发人员调用HttpServletRequest的getparameter(String name)方法从请求中获取数据,而Web框架都提供了数据绑定机制,由框架从请求中获取数据然后绑定到一个JavaBean对象中. Struts2提供了多种方式用于接收用户输入的数据. Struts2的action完全与Web解耦,要获取Web层的数据,需要使用ActionContext,它为action提供了一个执行