本文主要演示使用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. September 8th 2016 Week 37th Thursday

    The secret of high-impact business is early preparation. 高效商务,赢在未雨绸缪. Early and best preparation is ...

  2. August 8th 2016, Week 33rd Monday

    Everything is going on, but don't give up trying. 万事随缘,但不要放弃努力. Every time when I want to give up, y ...

  3. #import、#include、#import<>和#import””的区别

    一.#import与#include #import不会引起交叉编译的问题.因为在Objective-C中会存在C/C++和Object-C混编的问题,如果用#include引入头文件,会导致交叉编译 ...

  4. C# 使用Conditional特性而不是#if条件编译

    概述 #if/#endif 语句常用来基于同一份源码生成不同的编译结果,其中最常见的就是debug版和release版.但是这些工具在实际应用中并不是非常友好,因为它们容易被滥用,其代码页进而难以理解 ...

  5. 【翻译十三】java-并发之饥饿与活锁

    Starvation and Livelock Starvation and livelock are much less common a problem than deadlock, but ar ...

  6. python threading编程中的LOCK和RLOCK(可重入锁)

    找到一本PYTHON并发编辑的书, 弄弄.. #!/usr/bin/env python # -*- coding: utf-8 -*- import threading import time sh ...

  7. gdo图形引擎中的旋转角

    横滚角(Roll) bank.roll  绕y轴 z轴正向为起点逆时针方向:往左为正,往右为负,水平时为0:有效范围:-180度-180度 注:下图是从飞机的尾部-->头部方向观察所得 俯仰角( ...

  8. 11g SQL Monitor

    1,首先确认两个参数的值 SQL> show parameter statistics_level NAME                     TYPE     VALUE ------- ...

  9. Auto Layout

    Auto Layout XCode5+ Auto Layout Concepts 核心的概念是约束. Constraint Basics Constant value Relation Priorit ...

  10. php获取当前页面的完整url

    javascript实现: top.location.href 顶级窗口的地址 this.location.href 当前窗口的地址 php实现: //测试网址: http://localhost/b ...