【发布时间】:2023-03-21 00:48:01
【问题描述】:
我正在阅读Dataflow (Task Parallel Library),其中有一段说:
当您指定大于 1 的最大并行度时,会同时处理多条消息,因此,消息可能不会按照接收顺序进行处理。但是,从块中输出消息的顺序将是正确的。
什么意思?
例如,我将我的动作块设置为并行度 = 5:
testActionBlock = new ActionBlock<int>(i => Consumer(i),
new ExecutionDataflowBlockOptions()
{
MaxDegreeOfParallelism = 5
});
await Producer();
testActionBlock.Completion.Wait();
我的 Producer() 基本上将数字排入块中:
private async Task Producer()
{
for (int i=0; i<= 1000; i++)
{
await testActionBlock.SendAsync(i);
}
testActionBlock.Complete();
}
而我的 Consumer(i) 只需写出以下几行:
private async Task Consumer(int i)
{
if (i == 1)
{
await Task.Delay(5000);
}
Console.WriteLine(i);
}
这是否意味着 Consumer(2) 将被阻塞,直到 Consumer(1) 完成处理(因为有 5 秒的延迟)?我测试了代码,但似乎并非如此。即使我消除了 5 秒的延迟,我也没有看到输出是有序的。
[更新]
bBlock = new BufferBlock<int>(option);
testActionBlock = new ActionBlock<int>(i => Consumer(i),
new ExecutionDataflowBlockOptions()
{
MaxDegreeOfParallelism = 5
});
bBlock.LinkTo(testActionBlock);
await Producer();
testActionBlock.Completion.Wait();
我的 Producer() 现在将添加到 bBlock:
private async Task Producer()
{
for (int i=0; i<= 1000; i++)
{
await bBlock.SendAsync(i);
}
bBlock.Complete();
}
那么,在这种情况下,Consumer(1) 将等待 5 秒,然后 Consumer(2) 才能继续?
【问题讨论】:
标签: c# task-parallel-library tpl-dataflow