Поток данных блокируется, когда какой-то параллельный процесс выполняет тяжелую работу - PullRequest
0 голосов
/ 04 апреля 2019

Я пытаюсь понять поток данных TPL. У меня есть два блока вводаБлок оч следующийБлок.

inputBlock с использованием MaxDegreeOfParallelism = 2. У меня такая ситуация, что параллельное выполнение заданий может занять разное время. Я не хочу, чтобы поток данных останавливался из-за того, что выполнение некоторой работы Parallell занимает много времени. Я просто хочу, чтобы каждое задание Parallell брало один элемент из очереди и обрабатывало его, а затем передавало в следующий блок.

Я никогда не достигаю nextBlock, когда одно из параллельных заданий в первом блоке «inputBlock» переходит в спящий режим или выполняет тяжелую работу.

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 Ответ

1 голос
/ 04 апреля 2019

Ответом было использование EnsureOrdered = false.

new ExecutionDataflowBlockOptions {MaxDegreeOfParallelism = 2, EnsureOrdered = false});

...