当某个并行进程完成繁重的工作时,数据流将阻塞

时间:2019-04-04 08:32:06

标签: c# .net task-parallel-library dataflow

我试图了解TPL数据流。 我有两个块inputBlock和nextBlock。

使用MaxDegreeOfParallelism = 2的

inputBlock。 我有这种情况,完成并行作业可能需要花费不同的时间。我不希望由于某些并行作业需要很长时间才能完成而停止数据流。 我只是希望每个并行作业从队列中取出一项并处理它,然后将其传递到下一个块。

当第一个块“ inputBlock”中的并行作业之一进入睡眠状态或完成繁重的工作时,我永远不会到达nextBlock。

internal class Program
{
    private static bool _sleep = true;

    private static void Main(string[] args)
    {
        var inputBlock = new TransformBlock<string, string>(
            x =>
            {
                if (_sleep)
                {
                    _sleep = false;
                    Console.WriteLine("First thread sleeping");
                    Thread.Sleep(5000000);
                }
                Console.WriteLine("Second thread running");
                return x;
            },
            new ExecutionDataflowBlockOptions {MaxDegreeOfParallelism = 2}); //1


        var nextBlock = new TransformBlock<string, string>(
            x =>
            {
                Console.WriteLine(x);
                return x;
            }); //2

        inputBlock.LinkTo(nextBlock, new DataflowLinkOptions {PropagateCompletion = true});


        for (var i = 0; i < 100; i++)
        {
            input.Post(i.ToString());
        }

        input.Complete();

        Console.ReadLine();
    }
}

}

1 个答案:

答案 0 :(得分:1)

使用sureOrdered = false是答案。

新的ExecutionDataflowBlockOptions {MaxDegreeOfParallelism = 2,sureOrdered = false});