C# TPL 数据流 - 完成不起作用

2024-02-18

此代码永远不会到达最后一行,因为完成不会从 saveBlock 传播到 sendBlock。我究竟做错了什么?

var readGenerateBlock = new TransformBlock<int, int>(n =>
    {
        Console.WriteLine("Read " + n);
        Thread.Sleep(15);
        return n;
    }); 
var groupingBlock = new BatchBlock<int>(10);
var saveBlock = new TransformManyBlock<int[], int>(n =>
    {
        Console.WriteLine("Saving {0} items [{1}; {2}]", n.Count(), n.First(), n.Last());
        Thread.Sleep(150);
        return n;
    }); 
var sendBlock = new TransformBlock<int, int>(n =>
    {
        Console.WriteLine("Sending {0}", n);
        Thread.Sleep(25);
        return n;
    }, new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 2 }); 

readGenerateBlock.LinkTo(groupingBlock, new DataflowLinkOptions { PropagateCompletion = true });
groupingBlock.LinkTo(saveBlock, new DataflowLinkOptions { PropagateCompletion = true });
saveBlock.LinkTo(sendBlock, new DataflowLinkOptions { PropagateCompletion = true });

Parallel.For(0, 250, i => readGenerateBlock.Post(i));
readGenerateBlock.Complete();

sendBlock.Completion.Wait();
Console.WriteLine("Completed.");

您必须先从块中读取数据,然后才能完成。既然没有人在读书saveBlock,它永远不会完成。

如果您不需要数据,最简单的解决方案是使用ActionBlock代替TransformBlock。否则,就继续读取数据,直到块完成。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# TPL 数据流 - 完成不起作用 的相关文章

随机推荐

  • 运行 crontab 时出现权限被拒绝错误[重复]

    这个问题在这里已经有答案了 我在文件夹 csv file 中创建了一个 r 脚本 marc Marc Linux csv file ls 8388 26580527145 csv csv file Rproj excel source wr
  • Spark Dataframes UPSERT 到 Postgres 表

    我正在使用 Apache Spark DataFrames 来连接两个数据源并将结果作为另一个 DataFrame 获取 我想将结果写入另一个 Postgres 表 我看到这个选项 myDataFrame write jdbc url ta
  • Postman - 使用密钥文件进行 JWT 身份验证

    我正在尝试使用 Postman 来测试在 Google Cloud Platform 上开发的 API API 端点后面的 App Engine 我有 JSON 格式的密钥文件 type service account project id
  • BlackBerry 是否支持其应用程序开发人员的演示/测试版?

    我有兴趣为 BlackBerry 设备开发应用程序 想知道他们是否支持应用程序开发人员的演示版或测试版概念 我的意思是能够将我的应用程序的测试版或演示版部署给有限 受限的受众 例如业务合作伙伴 客户 外部测试人员等 他们中没有任何内容测试和
  • ASP.NET MVC - 如何抛出类似于 StackOverflow 上的 404 页面

    我目前有一个继承自的 BaseController 类System Web Mvc Controller 在那堂课上我有HandleError将用户重定向到 500 哎呀 我们搞砸了 页面的属性 目前这正在按预期进行 这有效
  • 让标签参与控制选项卡

    我有继承自的自定义控件Label并且有ControlStyle Selectable set to true 当用户单击该控件时 该控件将获得焦点 但如果用户从另一个控件进行选项卡 则不会获得焦点 即使当我有一个仅由该类型的控件填充的表单时
  • Reactjs 光滑的幻灯片

    我正在使用reactjs制作一个非常简单的滑块reactstrap 引导程序 工作示例 https codesandbox io s compassionate brook fz5mm https codesandbox io s comp
  • 尝试找出从 Firestore 字典中删除元素的更好方法

    我在应用程序中使用 Firestore 并且有一个名为 投票 的地图字段 用于显示用户的赞成票或反对票 它看起来像这样 我想添加一个选项来从那里删除元素 这就是我现在得到的 getting the user s votes dictiona
  • 将光标后的文本移动到新行

    我是 Vim 新手 我在 OSX Snow Leopard 上使用 MacVim 我必须采取的最常见操作之一是将光标移动到新行 并将光标后面的文本移动到新行 我知道在正常或可视模式下按 o 会将光标移动到新行并切换模式以进行插入 我想做的是
  • 注入和资源以及自动装配注释

    有什么区别 Inject and Resource and Autowired注释 我们什么时候应该使用它们 Inject Autowire Resource 之间的区别 自动连线 spring propriety 注解 与 Inject
  • 清除 Coldfusion 生产服务器中的缓存

    我正在使用 CFMX 并且存在一个问题 变量 yy 在 yyfiling 中未定义 这是生产中的一个问题 我正在推动对其进行更正 但它们似乎没有出现在服务器上 我想清除服务器缓存 以便我升级的代码可以生效 CFAdmin 生产模板已被缓存
  • 如何使用 protobuf-net 序列化/反序列化大型项目列表

    我有大约 5 亿个项目的清单 如果我序列化单个项目而不是列表 我可以将其序列化为带有 protobuf net 文件的文件 我无法将项目收集到价格列表中然后序列化 因为我耗尽了内存 因此 我必须一次序列化一条记录 using var inp
  • 为什么 Finalize() 仅在创建新对象后执行,而不是在调用 gc() 后执行?

    调用 gc 时 finalize 不应该立即执行吗 输出结果的顺序有点不太令人信服 class Test int x 100 int y 115 protected void finalize System out println Reso
  • 我可以在Asp.Net中访问另一个页面中一个页面的ViewState吗?

    有没有办法在另一个页面中访问一个页面的视图状态 请详细说明答案以消除我的疑虑 因为我认为 ViewState 的范围仅限于页面 无法在页面外部访问 您无法直接从一个页面访问另一个页面的 ViewState 如果要访问特定的 ViewStat
  • 如何在 HttpWebRequest 中混合压缩和缓存?

    我有一个 C 客户端与 Cherrypy http rest Web 服务通信 问题是我无法同时打开压缩和缓存 request AutomaticDecompression DecompressionMethods GZip Decompr
  • 如何在 HAML 中执行 if/else 而不重复缩进代码

    根据用户是否登录 我想打印不同类型的 body标签 这就是我目前的做法 if defined user body data account user account h1 Welcome all my content else body h
  • 在 Docker 容器中运行时,Flask_oidc 给出“Errno 99 无法分配请求的地址”

    Goal 从 Docker 容器中运行的 Flask 应用程序使用 OIDC 背景 我正在使用 Flask 构建一个 Web 应用程序 并希望使用 Keycloak 来提供访问权限 为此 我使用 Python 库flask oidc 所有服
  • 在不使用环回网络的情况下将数据包转发到同一主机中的服务

    我有这个 libnetfilter queue 应用程序 它根据某些 iptables 规则从内核接收数据包 在直接讨论我的问题之前 我提供了一个示例可行代码和其他工具来设置测试环境 以便我们的问题定义和可能的解决方案可以更加准确和稳健 以
  • Java Byte.parseByte() 错误

    我的代码中有一个小错误 我一生都无法弄清楚 我有一个字符串数组 它们是二进制数据的表示 从十六进制转换后 例如 一个索引是 1011 另一个索引是 11100 我遍历数组并用 0 填充每个索引 以便每个索引都是八个字节 当我尝试将这些表示形
  • C# TPL 数据流 - 完成不起作用

    此代码永远不会到达最后一行 因为完成不会从 saveBlock 传播到 sendBlock 我究竟做错了什么 var readGenerateBlock new TransformBlock