本文主要演示使用TPL 数据流库从数据流块(dataflow block)读写消息。

提供了同步方法和异步方法。

主要使用BufferBlock,其既能作为message source,有能作为message target。

  1. Install-Package Microsoft.Tpl.Dataflow
  2.  
  3. using System.Threading.Tasks.Dataflow;

 

1.同步方法读写消息

 

1.1 分别使用Post和Receive方法进行读写。

  1. public
    void SynchronouslyPostAndReceive()
  2. {
  3.     var bufferBlock = new BufferBlock<int>();
  4.  
  5.     for (int i = 0; i < 3; i++)
  6.     {
  7.         bufferBlock.Post(i);
  8.     }
  9.  
  10.     for (int i = 0; i < 3; i++)
  11.     {
  12.         Console.WriteLine(bufferBlock.Receive());
  13.     }
  14. }

输出:

0

1

2

解释:

 

从Post方法可以看出,此时BufferBlock扮演着ITargetBlock的角色;

同理,Receive方法调用时,BufferBlock扮演着ISourceBlock的角色;

这也就证明了BufferBlock同时用作Target和Source。已可以看出,同步的时候,BufferBlock实际上是FIFO。

 

1.2 使用TryReceive来读取

  1. public
    void SynchronouslyPostAndReceive()
  2. {
  3.     var bufferBlock = new BufferBlock<int>();
  4.  
  5.     for (int i = 0; i < 3; i++)
  6.     {
  7.         bufferBlock.Post(i);
  8.     }
  9.  
  10.     //for (int i = 0; i < 3; i++)
  11.     //{
  12.     // Console.WriteLine(bufferBlock.Receive());
  13.     //}
  14.  
  15.     int
    value;
  16.     while (bufferBlock.TryReceive(out
    value))
  17.     {
  18.         Console.WriteLine(value);
  19.     }
  20. }

输出:

0

1

2

1.3并发读写

使用Task,将读写放在不同的线程。

当Receive,且无数据时,则会阻塞。

  1. public
    void ConcurrentlyPostAndReceive()
  2. {
  3.     var bufferBlock = new BufferBlock<int>();
  4.     var post01 = Task.Run(() =>
  5.     {
  6.         bufferBlock.Post(1);
  7.         bufferBlock.Post(2);
  8.         bufferBlock.Post(3);
  9.         bufferBlock.Post(4);
  10.     });
  11.  
  12.     var receive = Task.Run(() =>
  13.     {
  14.         for (int i = 0; i < 6; i++)
  15.         {
  16.             Console.WriteLine(bufferBlock.Receive());
  17.         }
  18.     });
  19.  
  20.     var post02 = Task.Run(() =>
  21.     {
  22.         bufferBlock.Post(5);
  23.         bufferBlock.Post(6);
  24.     });
  25.  
  26.     Task.WaitAll(post01, receive, post02);
  27. }

输出:

5

1

2

3

4

6

2.异步方式读写消息

 

主要是TAP的一种套用。使用async 和await来实现。

 

  1. static async Task AsyncSendReceive(BufferBlock<int> bufferBlock)
  2. {
  3.     // Post more messages to the block asynchronously.
  4.     for (int i = 0; i < 3; i++)
  5.     {
  6.         await bufferBlock.SendAsync(i);
  7.     }
  8.  
  9.     // Asynchronously receive the messages back from the block.
  10.     for (int i = 0; i < 3; i++)
  11.     {
  12.         Console.WriteLine(await bufferBlock.ReceiveAsync());
  13.     }
  14.  
  15. }
  16.  
  17. public
    void Start()
  18. {
  19.     AsyncSendReceive(new BufferBlock<int>()).Wait();
  20. }

HowTo:使用数据流读写消息的更多相关文章

  1. HDFS的数据流读写数据 (面试开发重点)

    1 HDFS写数据流程 1.1 剖析文件写入 HDFS写数据流程,如图所示 1)客户端通过Distributed FileSystem模块向NameNode请求上传文件,NameNode检查目标文件是 ...

  2. 队列Queue:任务间的消息读写,安排起来~

    摘要:本文通过分析鸿蒙轻内核队列模块的源码,掌握队列使用上的差异. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列十三 消息队列Queue>,作者:zhushy . 队列(Queue)是 ...

  3. 分布式消息队列 Kafka

    分布式消息队列 Kafka 2016-02-25 杜亦舒 Kafka是一个高吞吐量的.分布式的消息系统,由Linkedin开发,开发语言为scala具有高吞吐.可扩展.分布式等特点 适用场景 活动数据 ...

  4. System V IPC(1)-消息队列

    一.概述                                                    System V三种IPC:消息队列,信号量,共享内存.这三种IPC最先出现在AT&am ...

  5. 【转】快速理解Kafka分布式消息队列框架

     from:http://blog.csdn.net/colorant/article/details/12081909 快速理解Kafka分布式消息队列框架 标签: kafkamessage que ...

  6. 快速理解Kafka分布式消息队列框架

    作者:刘旭晖 Raymond 转载请注明出处 Email:colorant at 163.com BLOG:http://blog.csdn.net/colorant/ ==是什么 == 简单的说,K ...

  7. Kafka分布式消息模型

    Kafka开发的主要初衷目标是构建一个用来处理海量日志,用户行为和网站运营统计等的数据处理框架.在结合了数据挖掘,行为分析,运营监控等需求的情况下,需要能够满足各种实时在线和批量离线处理应用场合对低延 ...

  8. 使用JDK自带的MessageDigest计算消息摘要

    使用JDK自带的MessageDigest计算消息摘要 上代码 /** * 使用JDK自带MessageDigest */ public class MessageDigestUtils { /** ...

  9. [转载] 快速理解Kafka分布式消息队列框架

    转载自http://blog.csdn.net/xiaolang85/article/details/18048631 ==是什么 == 简单的说,Kafka是由Linkedin开发的一个分布式的消息 ...

随机推荐

  1. java中带继承类的加载顺序详解及实战

    一.背景: 在面试中,在java基础方面,类的加载顺序经常被问及,很多时候我们是搞不清楚到底类的加载顺序是怎么样的,那么今天我们就来看看带有继承的类的加载顺序到底是怎么一回事?在此记下也方便以后复习巩 ...

  2. August 31st 2016 Week 36th Tuesday

    A friend without faults will never be found. 没有缺点的朋友是永远找不到的. You can't find a friends without faults ...

  3. 高效使用你的Xcode

    (via:VongLo's Dev Space  原文:Supercharging Your Xcode Efficiency)   好莱坞电影里经常看到黑客们手指在键盘上飞速跳跃,同时终端上的代码也 ...

  4. Java 回调机制的理解

    // 在接口中声明一个处理耗时操作结果的回调方法. // Local 实现这个接口,实现处理耗时操作结果的回调方法. // Local 获得 Remote 对象,在子线程中调用 Remote 的处理耗 ...

  5. React之JSX入门

    React是由ReactJS与React Native组成,其中ReactJS是Facebook开源的一个前端框架,React Native 是ReactJS思想在native上的体现! JSX并不是 ...

  6. UVA 111 History Grading

    读题读了好久,其实就是在输入数据时要对数据的位置进行相应的改变 #include<iostream> #include<cstring> #include<cstdio& ...

  7. Android Stutio -- 编译报错: Error:File path too long on Windows, keep below 240

    原文:http://blog.csdn.net/qq_28195645/article/details/51556975 目录太长,解决办法: 1.将整个project移到更外层的目录,直至没有报错, ...

  8. 与你相遇好幸运,Sails.js自定义数据库名

    在/api/models/下,自定义的.js文件内容 module.exports = { tableName: '自定义的数据库名',  autoCreatedAt: false, //关闭  au ...

  9. python列表分组的技巧

    今天项目上需要到的. 如,将并行部署的机器分批次. 一次十台机器,如果分3次并行部署,则第一次123,第二次456,第三次789,第四次10. #coding=utf-8 a=[1,2,3,4,5,6 ...

  10. hdu 2393:Higher Math(计算几何,水题)

    Higher Math Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...