Я пытаюсь понять поток данных 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();
}
}
}