C# 为什么我的BroadcastBlock发布时没有执行我的ActionBlock?
我试图理解C语言,所以我写了一个提琴,我很好奇为什么我的动作块没有在我的例子中执行C# 为什么我的BroadcastBlock发布时没有执行我的ActionBlock?,c#,multithreading,dataflow,C#,Multithreading,Dataflow,我试图理解C语言,所以我写了一个提琴,我很好奇为什么我的动作块没有在我的例子中执行 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) { v
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
在线程ID:18上发布14
在线程ID:18上发布15
我希望在显示使用广播块上发布的数据的操作块时,会有几行混合显示。延迟评估是操作块未执行的原因 所有生产者和所有消费者都是惰性评估的,因此每次对它们进行枚举时,都会产生新的生产者和消费者。因此,producer.LinkToconsumer中引用的生产者与producer.post中引用的生产者不同 当我在调试器中单步执行代码时,以及在producer.Posti暂停时,我意识到这一点,它显示当前在作用域中的producer有0个链接到它的目标 解决方案是在所有生产者和所有消费者的定义中添加ToList或ToArray
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();