在下面的测试代码中,我期待这个结果:
1, 2000
2, 4000
3, 6000
然而实际结果是:
3, 6000
2, 4000
1, 2000
此外,我只能在 6 秒后在屏幕上看到结果。这意味着任何被竞争的输入都在等待并处理到下一阶段。
如何使管道在完成后立即吐出每个输入的结果?
public static void Run()
{
Func<int, string> fn = n =>
{
var sleep = n * 2000;
Thread.Sleep(sleep);
return n + ", " + sleep;
};
var opts = new ExecutionDataflowBlockOptions
{
MaxDegreeOfParallelism = 4
};
var transformBlock = new TransformBlock<int, string>(fn, opts);
var bufferBlock = new BufferBlock<string>(opts);
transformBlock.LinkTo(bufferBlock, new DataflowLinkOptions { PropagateCompletion = true });
for (var i = 3; i > 0; i--)
transformBlock.Post(i);
Console.WriteLine(bufferBlock.Receive());
Console.WriteLine(bufferBlock.Receive());
Console.WriteLine(bufferBlock.Receive());
}