问题标签 [tpl-dataflow]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
384 浏览

c# - MaxDegreeOfParallelism 阻塞主线程?

我有下一个代码,并且工作正常:

Windows 窗体工作正常......进程不会阻止用户界面

但是,如果我将 MaxDgreeOfParallelism 更改为其他值(2 或 3 或 4...),则 UI 将被阻止,直到进程完成。

我已经在 Visual Studio 中看到了 Parallel Tasks 窗口和 Thread 窗口,在这两种情况下,一切都在工作线程中工作,但在后一种情况下(当 MaxDgreeOfParallelism 它不同于 1 时)UI 直到进程完成才响应

为什么?

0 投票
2 回答
356 浏览

c# - Dataflow 块中的不同消息类型

我需要设计自定义数据流块,它的作用类似于缓冲区,但会在超时后使项目可用。我会将传入的消息放入队列并启动计时器。当计时器被触发时,我会将一个项目从队列移动到 BufferBlock 中,这将使其可供 Dataflow 消费者使用。

如果我将一个项目从内部队列移动到定时器处理程序的输出 BufferBlock 中,显然它不会是线程安全的,因为定时器处理程序可能与入队调用和损坏的队列发生冲突。MSDN 中声称数据流是基于 Actor 思想的,它假设消息是单线程执行的,从而解决了同步问题。但是如果我引入一个计时器处理程序,这将打破这个假设。我可以在队列上使用老派锁,或者使用 CuncurrentQueue 但我很好奇是否有更多特殊的数据流方式来管理计时器,以便它不会与数据流块的 Post() 调用冲突。

或者扩展这个问题,是否有一种优雅的方式让数据流块处理几种不同类型的消息并且仍然提供线程安全模型?

0 投票
1 回答
429 浏览

c# - 重用 TransformBlock 来强制最大下载连接

我正在构建一个组件,该组件从给定的 url 下载信息并将其解析为我的业务类。

这必须分两个阶段进行。正在下载的页面包含指向在第二阶段下载的一组其他页面的 URL。

我希望所有这些都尽可能并行,并试图通过使用 TPL 数据流框架来降低整体复杂性。

这是我的(简化的)设置:

在此处输入图像描述

  • 我将 URL 发布到缓冲区块,缓冲区块将它们移动到下载块。
  • 在下载块中下载 HTML。
  • 下载块有两个解析块的条件链接,因此页面类型 A 的 html 被移动到“解析页面 A”,这是一个TransformManyBlock
  • 解析页面 A 生成一组指向类型 B 页面的 URL。
  • 这些将再次发布到下载块。
  • 最后,条件链接将页面类型 B 的 HTML 发布到最后一个块。

我正在重用下载块,因为我想通过设置 MaxDegreeOfParallelization 以这种方式限制与服务器的最大连接数。

如果我可以简单地使用两个单独的下载块,设置会容易得多,但是我将无法以这种方式限制连接数,并且仍然有尽可能多的并行连接。

现在我对这个设置的问题:

如何正确传播完成?当我发布完所有 URL 后,我在缓冲区块上调用Complete() 。但是我不能直接将它传播到下载块,因为从“解析页面 A”块生成的 URL 可能仍然需要它,即使在缓冲区块已将所有 URL 发布到它之后。

但我也将下载块完成与缓冲区块和解析页面 A 块完成结合起来,因为这样解析页面 A 将永远不会完成。

我还考虑过在缓冲区块完成后调用“解析页面 A”的 Complete(),但是下载块中​​可能仍有数据将被“解析块 A”拒绝。

有没有办法摆脱这种循环困境?

还是我完全走错了路,应该以其他方式做?

0 投票
2 回答
4896 浏览

c# - 如何在 TPL 中实现连续运行的数据流块?

我使用 BufferBlock 和 ActionBlock 设置了生产者/消费者数据流块,它在控制台应用程序中运行良好;

将所有项目添加到 BurfferBlock 并将 BufferBlock 与其他 Action Items 链接后;它运行良好。

现在我想使用该内部服务,该数据流块管道将始终处于启动状态,并且当消息将通过外部事件可用时,它将进入缓冲区块并开始处理。我怎样才能做到这一点?

到目前为止,我已经完成了以下工作:

0 投票
1 回答
101 浏览

.net - 链接块未完成

我从 TPL DataFlow 开始。我创建了以下工作代码。readFilesBlock 是一个BufferBlock 它是这样填充的:

现在我像这样使用 BufferBlock (readFilesBlock)

这工作正常。现在我想使用链接功能

我试过了:

但这一次我永远不会完成。

我究竟做错了什么?

当我不等待 Bagaction 中的存储文件时,没有退回物品。

0 投票
2 回答
669 浏览

c# - 获取可用的消息批次

我正在尝试使用任务并行库实现以下行为:

当消息到达时,我想按顺序处理它们,但要分组处理。因此,当第一条消息到达时,应立即处理。如果在处理第一条消息时有 2 条消息进来,那么它们应该以 2 条为一组进行处理。

我几乎可以使用BatchBlock链接到ActionBlock

上面代码的问题是,如果一个项目在TriggerBatch()调用之后到达,那么它需要等待批次填满。如果我在每个帖子之后触发批处理,那么ActionBlock总是会收到单个消息。

0 投票
2 回答
299 浏览

c# - 适用于 Windows Phone 的 Microsoft TPL 数据流

我们知道Microsoft TPL 数据流支持平台:

  • .NET 框架 4.5
  • 适用于 Windows 应用商店应用的 .NET
  • 便携式类库

但没有 Windows Phone 8 支持。

替代 BufferBlock<> 等的替代方案是什么?

0 投票
1 回答
1394 浏览

c# - 如何在 TPL 数据流中安排流量控制?

我试图在 TPL 数据流中控制数据流。我有一个非常快的生产者和一个非常慢的消费者。(我的真实代码更复杂,但无论如何,这是一个很好的模型,它重现了问题。)

当我运行它时,代码开始消耗内存,就好像它已经过时了——并且生产者上的输出队列尽可能快地填满。我真正希望看到的是生产者停止运行一段时间,直到消费者有机会要求它。根据我对文档的阅读,这是应该发生的:也就是说,我认为生产者会等到消费者有空间。

显然,情况并非如此。我该如何解决它,以免队列发疯?

0 投票
1 回答
1647 浏览

c# - 如何迭代 BufferBlock 中的项目?

我最近开始使用 .NET 4.5 的 TPL Dataflow 库,块的整个概念对我来说是新的。我在我的应用程序中实现了一个生产者-消费者队列,我需要防止重复的消息被放入队列,因此需要检查消息是否已经排队。我正在使用一种BufferBlock<Message>类型(Message是一种自定义类型)。BufferBlock具有 Count 属性,但这对这个问题没有帮助,因为需要唯一标识消息。

有没有办法检查 a 是否BufferBlock包含一个项目或检查所有项目并检查它们?是否可以转换BufferBlock为允许对项目进行迭代的东西?我正在关注我在 MSDN 上看到的一个示例,它不检查项目是否在队列中,但我认为检查队列的内容是一项相当需要的操作。任何帮助表示赞赏。

0 投票
2 回答
1826 浏览

c# - 数据流(任务并行库)和异步等待

假设我在 .NET 中使用数据流块。据说“这个数据流模型促进了基于参与者的编程”,这正是我想要在这里得到的。

但是,如果我处理来自 aBufferBlock<T>和消息处理器中的消息,我决定使用async/ await,这会将执行分叉到当前线程和等待任务的工作线程。

有什么方法可以防止参与者/消息处理器中的并发执行吗?

如果等待的任务使用带有本机回调的非阻塞 IO 操作执行,那很好。但我真的很想确保任何 .NET 代码只同步执行。