Post 数组到 BatchBlock
Post Array to BatchBlock
我正在尝试将一些数据推送到 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()));
}
感谢您澄清问题。基于这种期望的行为:
one situation which I have is like, var transformBlock = new TransformBlock<int, List<long>>
, TransformBlock
returns List<long>
and I linked it to BatchBlock transformBlock.LinkTo(batchBlock)
and batchBlock
should process values when batchsized reached to 3 values not 15 values.
您要找的是 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;
}
}
我正在尝试将一些数据推送到 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()));
}
感谢您澄清问题。基于这种期望的行为:
one situation which I have is like,
var transformBlock = new TransformBlock<int, List<long>>
,TransformBlock
returnsList<long>
and I linked it toBatchBlock transformBlock.LinkTo(batchBlock)
andbatchBlock
should process values when batchsized reached to 3 values not 15 values.
您要找的是 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;
}
}