TPL数据流执行输出顺序

时间:2018-10-10 07:25:09

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

在下面的测试代码中,我期望得到这样的结果:

ctx['location_ids'] = vals['location_ids']
TypeError: 'bool' object has no attribute '__getitem__'

但是实际结果是:

1, 2000
2, 4000
3, 6000

此外,我仅在6秒后才在屏幕上看到结果。这意味着任何竞争的输入都在等待并处理到下一个阶段。

如何使流水线在输入完成后立即吐出每个输入的结果?

3, 6000    
2, 4000
1, 2000

1 个答案:

答案 0 :(得分:4)

默认情况下,即使并行处理消息,数据流也会保留消息的顺序。

要尽快转换消息(即乱码),请在EnsureOrdered的选项中将false设置为TransformBlock

请确保使用最新版本的数据流(当前4.9版中存在nuget软件包System.Threading.Tasks.Dataflow),因为EnsureOrdered并不总是存在。

示例:

class Program
{
    static void Main( string[] args )
    {
        var transformBlock = new TransformBlock<int, int>( x =>
        {
            Thread.Sleep( x );
            return x;
        }, new ExecutionDataflowBlockOptions {EnsureOrdered = false, MaxDegreeOfParallelism = 10} );
        var actionBlock = new ActionBlock<int>( x => Console.WriteLine( x ) );
        transformBlock.LinkTo( actionBlock, new DataflowLinkOptions {PropagateCompletion = true});
        for( var i = 9; i > 0; i-- )
            transformBlock.Post( i * 1000 );
        transformBlock.Complete();
        actionBlock.Completion.Wait();
        Console.ReadLine();
    }
}

此输出

1000
2000
3000
4000
5000
6000
7000
8000
9000