我正在尝试理解C#中的Dataflow,所以我写了一个fiddle here,我很好奇为什么我的示例中没有执行我的动作块。
using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Threading.Tasks.Dataflow;
public class Program
{
public static void Main(string[] args)
{
var numberOfProducers = 1;
var numberOfConsumers = 10;
var allProducers = Enumerable.Range(0, numberOfProducers).Select(x => new BroadcastBlock<double>(d =>
{
return d;
},
new DataflowBlockOptions()
{
BoundedCapacity = 500
}));
var allConsumers = Enumerable.Range(0, numberOfConsumers).Select(x => new ActionBlock<double>(d =>
{
Console.WriteLine(String.Format("Consuming {0} on Thread ID: {1}", d, Thread.CurrentThread.ManagedThreadId));
},
new ExecutionDataflowBlockOptions()
{
BoundedCapacity = 500
}));
foreach (var producer in allProducers)
{
foreach (var consumer in allConsumers)
{
producer.LinkTo(consumer);
}
}
Parallel.For(0, 20, (i) =>
{
foreach (var producer in allProducers)
{
Console.WriteLine(String.Format("Posting {0} on Thread ID: {1}", i, Thread.CurrentThread.ManagedThreadId));
producer.Post(i);
}
}
);
}
}
该程序的输出示例如下所示
在线程ID: 18上发布0
在线程ID: 16上发布10
在线程ID: 17上发布1
在线程ID: 19上发布11
在线程ID: 18上发布2
在线程ID: 17上发布4
在线程ID: 17上发布5
在线程ID: 17上发布6
在线程ID: 18上发布3
在线程ID: 18上发布12
在线程ID: 17上发布7
在线程ID: 19上发布16
在线程ID: 17上发布8
在线程ID: 19上发布17
在线程ID: 17上发布9
在线程ID: 19上发布18
在线程ID: 19上发布19
在线程ID: 18上发布13
帖子14,主题ID: 18
在线程ID: 18上发布15
我希望在显示消耗广播块上发布的数据的操作块时,会有几行代码混合在一起。
发布于 2018-06-09 05:20:30
懒惰计算是动作块不能被执行的原因。
allProducers
和allConsumers
是惰性计算的,所以每次枚举它们时都会产生新的生产者和消费者。因此,producer.LinkTo(consumer)
中引用的生产者与producer.Post(i)
中引用的生产者是不同的生产者
我在调试程序中单步执行代码时意识到了这一点,当在producer.Post(i)
处暂停时,它显示当前作用域中的生产者有0个链接到它的目标。
解决方案是将ToList
或ToArray
添加到allProducers
和allConsumers
的定义中
var allProducers = Enumerable.Range(0, numberOfProducers).Select(x => new BroadcastBlock<double>(d =>
{
return d;
})).ToList();
var allConsumers = Enumerable.Range(0, numberOfConsumers).Select(x => new ActionBlock<double>(d =>
{
Console.WriteLine($"Consuming {d} on Thread ID: {Thread.CurrentThread.ManagedThreadId}"); ;
})).ToList();
https://stackoverflow.com/questions/50762336
复制相似问题