【发布时间】:2015-04-25 05:04:57
【问题描述】:
我在将BroadcastBlock(s) 连接到BatchBlocks 时遇到问题。场景是来源是BroadcastBlocks,收件人是BatchBlocks。
在下面的简化代码中,只有一个补充动作块执行。我什至将每个 BatchBlock 的 batchSize 设置为 1 来说明问题。
将 Greedy 设置为“true”将使 2 ActionBlocks 执行,但这不是我想要的,因为它会导致 BatchBlock 继续进行,即使它尚未完成。有什么想法吗?
class Program
{
static void Main(string[] args)
{
// My possible sources are BroadcastBlocks. Could be more
var source1 = new BroadcastBlock<int>(z => z);
// batch 1
// can be many potential sources, one for now
// I want all sources to arrive first before proceeding
var batch1 = new BatchBlock<int>(1, new GroupingDataflowBlockOptions() { Greedy = false });
var batch1Action = new ActionBlock<int[]>(arr =>
{
// this does not run sometimes
Console.WriteLine("Received from batch 1 block!");
foreach (var item in arr)
{
Console.WriteLine("Received {0}", item);
}
});
batch1.LinkTo(batch1Action, new DataflowLinkOptions() { PropagateCompletion = true });
// batch 2
// can be many potential sources, one for now
// I want all sources to arrive first before proceeding
var batch2 = new BatchBlock<int>(1, new GroupingDataflowBlockOptions() { Greedy = false });
var batch2Action = new ActionBlock<int[]>(arr =>
{
// this does not run sometimes
Console.WriteLine("Received from batch 2 block!");
foreach (var item in arr)
{
Console.WriteLine("Received {0}", item);
}
});
batch2.LinkTo(batch2Action, new DataflowLinkOptions() { PropagateCompletion = true });
// connect source(s)
source1.LinkTo(batch1, new DataflowLinkOptions() { PropagateCompletion = true });
source1.LinkTo(batch2, new DataflowLinkOptions() { PropagateCompletion = true });
// fire
source1.SendAsync(3);
Task.WaitAll(new Task[] { batch1Action.Completion, batch2Action.Completion }); ;
Console.ReadLine();
}
}
【问题讨论】:
-
我认为将
Greedy设置为true是 正确的解决方案。如果您担心的是,它不会导致创建较小的批次。
标签: c# concurrency task-parallel-library tpl-dataflow