【问题标题】:Post Array to BatchBlock将数组发布到 BatchBlock
【发布时间】:2023-04-03 13:11:01
【问题描述】:

我正在尝试将一些数据推送到 BatchBlock,我需要在 foreach 循环中一一传递。我试图搜索一些将数组传递给 batchBlock 的方法,但没有找到类似的方法。

是否有任何方法或解决方法可以接受数组,如果没有,不包含此功能的原因是什么。

var modelsDataTable = modelsAndFormulasDataSet.Tables[0];

foreach (DataRow row in modelsDataTable.Rows)
{
modelIdsBatchBlock.Target1.Post<long>(row.Field<long>(AppConstants.ModelsDataTable.ModelId.ToString()));
}

【问题讨论】:

  • 你能解释一下为什么你需要这样做吗,这可能是XY Problem?但简而言之,您可以将批处理块的类型参数设为数组而不是长数组,例如new BatchBlock&lt;long[]&gt;().
  • 如果我初始化像 var batchBlock = new BatchBlock(3) 然后 batchBlock.post(new long[5](){1,2,3,4,5}) ;它将在 3 个数组发布到批处理块后调度,3 个长度为 5 的数组意味着它将在输入 15 个值后调度。但我只想发送 3 个值。
  • 您完全正确。那么你想要的行为到底是什么?您是说要发布一个数组并拥有三个块输出组吗?
  • 我遇到的一种情况是,var transformBlock = new TransformBlock>,TransformBlock 返回 List,我将它链接到 BatchBlock transformBlock.LinkTo(batchBlock) 和 batchBlock当批量达到 3 个值而不是 15 个值时应该处理值。

标签: c# .net task-parallel-library tpl-dataflow


【解决方案1】:

感谢您澄清问题。基于这种期望的行为:

我遇到的一种情况是,var transformBlock = new TransformBlock&lt;int, List&lt;long&gt;&gt;TransformBlock 返回 List&lt;long&gt;,我将其链接到 BatchBlock transformBlock.LinkTo(batchBlock)batchBlock 应该在批量达到 3 个值而不是 15 个值时处理值。

您要查找的是TransformManyBlock。这是一个在 NUnit 测试中模拟您想要的行为的示例:

[TestFixture]
public class BlockTester
{
    [Test]
    public async Task BuildPipeline()
    {
        var inputBlock = new TransformBlock<int, List<long>>(x => Enumerable.Repeat((long)0, 6).ToList());
        var xFormBlock = new TransformManyBlock<List<long>, long>(x => x);
        var batchBlock = new BatchBlock<long>(3);
        var testBlock = new ActionBlock<long[]>(x => Assert.AreEqual(3, x.Length));

        inputBlock.LinkTo(xFormBlock, new DataflowLinkOptions() { PropagateCompletion = true });
        xFormBlock.LinkTo(batchBlock, new DataflowLinkOptions() { PropagateCompletion = true });
        batchBlock.LinkTo(testBlock, new DataflowLinkOptions() { PropagateCompletion = true });

        await inputBlock.SendAsync(1);
        await inputBlock.SendAsync(2);
        await inputBlock.SendAsync(3);

        inputBlock.Complete();
        await testBlock.Completion;
    }
}

【讨论】:

    猜你喜欢
    • 2013-08-05
    • 2014-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    • 2023-03-13
    • 2020-12-15
    相关资源
    最近更新 更多