C# 为什么我的BroadcastBlock发布时没有执行我的ActionBlock?

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

我试图理解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)
    {
        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();