【C#】流式计算 - System.Threading.Tasks.Dataflow
流式计算是利用分布式的思想和方法,对海量“流”式数据进行实时处理的系统,它源自对海量数据“时效”价值上的挖掘诉求。
数据流的处理是将数据分块数据,并进行网格处理。数据在输入端流入,经过处理网格,然后在输出端流出。
Dataflow 允许你创建一系列 数据块 (Block),数据从一个块流向下一个块,每个块可以处理、转换、过滤或存储数据。它适用于 流式计算、数据管道、异步并行处理 等场景。
System.Threading.Tasks.Dataflow:
| 类名 | 说明 |
|---|---|
| BufferBlock<T> | 数据缓冲区,存储数据以供后续处理。 |
| BroadcastBlock<T> | 广播数据到多个接收者,类似于发布-订阅模式。 |
| TransformBlock<TInput, TOutput> | 处理数据并转换为另一种类型。 |
| TransformManyBlock<TInput, TOutput> | 类似 TransformBlock, 但可以返回多个输出。 |
| ActionBlock<T> | 终端处理块,执行某个操作。 |
| JoinBlock<T1, T2> | 合并两个数据流,并在它们都收到数据后触发处理。 |
| BatchBlock< T> | 收集一定数量的数据后,再进行批量处理。 |
| WriteOnceBlock<T> | 只允许写入一次的数据块。 |
1、BufferBlock 数据缓冲
private BufferBlock<int> _buffer = new BufferBlock<int>();
/// <summary>生产者</summary>
private void Producer()
{
while (true)
{
int item = Produce(); // 生产数据
_buffer.Post(item); // 把数据推入 BufferBlock (同步方式)
// await _buffer.SendAsync(item) // (异步方式)
Thread.Sleep(500);
}
}
/// <summary>消费者</summary>
private void Consumer(string name)
{
while (true)
{
int item = _buffer.Receive(); // 获取数据 // 这里阻塞,直到有数据
// int item = await _buffer.ReceiveAsync(); // (异步方式)
// ...
}
// 或
while (await _buffer.OutputAvailableAsync())
{
while (_buffer.TryReceive(out int value))
{
// ...
}
}
}
public void Main()
{
var p = Task.Factory.StartNew(Producer);
// 多消费者
var c1 = Task.Factory.StartNew(() => Consumer("A"));
var c2 = Task.Factory.StartNew(() => Consumer("B"));
var c3 = Task.Factory.StartNew(

最低0.47元/天 解锁文章
947

被折叠的 条评论
为什么被折叠?



