首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当我的BroadcastBlock发布时,为什么我的ActionBlock没有执行?

当我的BroadcastBlock发布时,为什么我的ActionBlock没有执行?
EN

Stack Overflow用户
提问于 2018-06-08 21:59:57
回答 1查看 178关注 0票数 0

我正在尝试理解C#中的Dataflow,所以我写了一个fiddle here,我很好奇为什么我的示例中没有执行我的动作块。

代码语言:javascript
运行
复制
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

我希望在显示消耗广播块上发布的数据的操作块时,会有几行代码混合在一起。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-09 05:20:30

懒惰计算是动作块不能被执行的原因。

allProducersallConsumers是惰性计算的,所以每次枚举它们时都会产生新的生产者和消费者。因此,producer.LinkTo(consumer)中引用的生产者与producer.Post(i)中引用的生产者是不同的生产者

我在调试程序中单步执行代码时意识到了这一点,当在producer.Post(i)处暂停时,它显示当前作用域中的生产者有0个链接到它的目标。

解决方案是将ToListToArray添加到allProducersallConsumers的定义中

代码语言:javascript
运行
复制
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();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50762336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档