How to: 使用 数据流 实现生产者-消费者模式
producer把消息发送到消息块,consumer从块读取消息。
安装:
- Install-Package Microsoft.Tpl.Dataflow
- using System.Threading.Tasks.Dataflow;
解释:
Produce方法随机生成字节,并Post到ITargetBlock对象;
Consumer方法从ISourceBlock对象读取字节;
可以使用BufferBlock来同时扮演源和目标对象。
Post():同步发送消息。
Complete():表明当前块(source block)已经没有数据更多的数据了。
Consumer方法使用await和async操作符异步地计算总的字节数。
OutputAvailableAsync():从source block收到一个通知(接收到Complete的通知),表明没有更多的数据可用。
- public
static
class DataflowProducerConsumer - {
- // Demonstrates the production end of the producer and consumer pattern.
- static
void Produce(ITargetBlock<byte[]> target) - {
- Random rand = new Random();
- // In a loop, fill a buffer with random data and
- // post the buffer to the target block.
- for (int i = 0; i < 100; i++)
- {
- // Create an array to hold random byte data.
- byte[] buffer = new
byte[1024]; - // Fill the buffer with random bytes.
- rand.NextBytes(buffer);
- // Post the result to the message block.
- target.Post(buffer);
- }
- // Set the target to the completed state to signal to the consumer
- // that no more data will be available.
- target.Complete();
- }
- // Demonstrates the consumption end of the producer and consumer pattern.
- static async Task<int> ConsumeAsync(ISourceBlock<byte[]> source)
- {
- // Initialize a counter to track the number of bytes that are processed.
- int bytesProcessed = 0;
- // Read from the source buffer until the source buffer has no
- // available output data.
- while (await source.OutputAvailableAsync())
- {
- byte[] data = source.Receive();
- // Increment the count of bytes received.
- bytesProcessed += data.Length;
- }
- return bytesProcessed;
- }
- static
void Run(string[] args) - {
- // Create a BufferBlock<byte[]> object. This object serves as the
- // target block for the producer and the source block for the consumer.
- var buffer = new BufferBlock<byte[]>();
- // Start the consumer. The Consume method runs asynchronously.
- var consumer = ConsumeAsync(buffer);
- // Post source data to the dataflow block.
- Produce(buffer);
- // Wait for the consumer to process all data.
- consumer.Wait();
- // Print the count of bytes processed to the console.
- Console.WriteLine("Processed {0} bytes.", consumer.Result);
- }
- }
参考:https://msdn.microsoft.com/en-us/library/hh228601(v=vs.110).aspx
How to: 使用 数据流 实现生产者-消费者模式的更多相关文章
- java多线程 生产者消费者模式
package de.bvb; /** * 生产者消费者模式 * 通过 wait() 和 notify() 通信方法实现 * */ public class Test1 { public static ...
- LabVIEW之生产者/消费者模式--队列操作 彭会锋
LabVIEW之生产者/消费者模式--队列操作 彭会锋 本文章主要是对学习LabVIEW之生产者/消费者模式的学习笔记,其中涉及到同步控制技术-队列.事件.状态机.生产者-消费者模式,这几种技术在在本 ...
- 转:Task任务调度实现生产者消费者模式 (个人理解后文)
纯属个人愚见.欢迎加入反驳(PiDou). 1.前文大致就是,利用Queue配置的一个TaskFactory任务调度器.实现生产者消费者模式的例子..首先我就试了 第一种 FIFO(先进先出)的配置. ...
- Lucene.net站内搜索—4、搜索引擎第一版技术储备(简单介绍Log4Net、生产者消费者模式)
目录 Lucene.net站内搜索—1.SEO优化 Lucene.net站内搜索—2.Lucene.Net简介和分词Lucene.net站内搜索—3.最简单搜索引擎代码Lucene.net站内搜索—4 ...
- MVC异常日志生产者消费者模式记录(异常过滤器)
生产者消费者模式 定义自己的异常过滤器并注册 namespace Eco.Web.App.Models { public class MyExceptionAttribute : HandleErro ...
- 转:Task任务调度实现生产者消费者模式
我们经常会遇到生产者消费者模式,比如前端各种UI操作事件触发后台逻辑等.在这种典型的应用场景中,我们可能会有4个业务处理逻辑(下文以P代表生产者,C代表消费者): 1. FIFO(先进先出) ...
- .net学习之多线程、线程死锁、线程通信 生产者消费者模式、委托的简单使用、GDI(图形设计接口)常用的方法
1.多线程简单使用(1)进程是不执行代码的,执行代码的是线程,一个进程默认有一个线程(2)线程默认情况下都是前台线程,要所有的前台线程退出以后程序才会退出,进程里默认的线程我们叫做主线程或者叫做UI线 ...
- 使用BlockingQueue的生产者消费者模式
BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题.通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利.使用场景. 首先它是一个队列,而一个队 ...
- Java设计模式—生产者消费者模式(阻塞队列实现)
生产者消费者模式是并发.多线程编程中经典的设计模式,生产者和消费者通过分离的执行工作解耦,简化了开发模式,生产者和消费者可以以不同的速度生产和消费数据.这篇文章我们来看看什么是生产者消费者模式,这个问 ...
随机推荐
- osg绘制一个球体
//By smells2 at Lab 2012-02-21#include <osg/Group>#include <osg/Geode>#include <osg/S ...
- [Linux] vim的高亮查找操作
reference : http://blog.chinaunix.net/uid-20732478-id-763411.html 使用了VIM这么久,却一直无法牢记一些基本的操作指令.今天查找一个 ...
- October 9th 2016 Week 41st Sunday
No matter how resourceful you are, you can't fight fate. 人纵有万般能耐,终也敌不过天命. I find that I gradually be ...
- 使用vsphere client 克隆虚拟机
免费的VMWare ESXi5.0非常强大,于是在vSphere5.0平台中ESXi取代了ESX.,使用ESXi经常会遇到这样的问题,我需要建立多个虚拟机,都是windows2003操作系统,难道必须 ...
- 通过NSString初始化OC类
NSString *className = self.classNames[indexPath.section][indexPath.row]; BaseMapViewController *s ...
- iOS获取状态栏和导航栏尺寸(宽度和高度)
iPhone开发当中,有时需要获取状态栏和导航栏高度.宽度信息,方便布局其他控件.下面介绍一下如何获取这些信息: // 状态栏(statusbar) CGRect rectStatus = [[UIA ...
- cutpFTP设置步骤
cutpFTP设置步骤 平常时为了方便两台电脑之间传送数据,我们可以使用cutpftp这个工具实现,而且cutpftp还具有定时传送的功能,非常方便使用.以下是使用该工具的“同步文件夹”功能同步两台电 ...
- Nginx详解(一)
1.Nginx是什么? Nginx就是反向代理服务器. 首先我们先来看看什么是代理服务器,代理服务器一般是指局域网内部的机器通过代理服务发送请求到互联网上的服务器,代理服务器一般作用于客户端.比如Go ...
- jQuery ajax同步的替换方法,使用 $.Deferred()对象
function aa() { var defer = $.Deferred(); $.ajax({ url: "/Handler1.ashx", type: "post ...
- Pyqt QListWidget之缩略图列表
QListWidget 可以设置模型setViewMode 当setViewMode值为QListView.IconMode 表示Icon模式 以下代码来自Pyqt Example #!/usr/b ...