代码之家  ›  专栏  ›  技术社区  ›  TJ Rockefeller

为什么当我的广播块发布时我的actionblock没有执行?

  •  0
  • TJ Rockefeller  · 技术社区  · 8 年前

    我在试着理解 Dataflow 所以我写了一把小提琴 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

    在线程id:18上发布14

    在线程id:18上发布15

    我希望在显示使用广播块上发布的数据的操作块时混合使用几行。

    1 回复  |  直到 8 年前
        1
  •  0
  •   TJ Rockefeller    8 年前

    惰性计算是操作块无法执行的原因。

    allProducers allConsumers 是懒惰的评价,所以每当他们被列举出新的生产者和新的消费者正在生产。因此,在 producer.LinkTo(consumer) 是一个不同的生产者 producer.Post(i)

    当我在调试器中单步执行代码,并在 制作人.邮政(一) 这表明,目前范围内的生产商有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();