Пытаюсь осознать «доработку» в блоках TPL Dataflow. В частности, TransformBlock
, похоже, никогда не завершается. Почему?
Пример программы
Мой код вычисляет квадрат всех целых чисел от 1 до 1000. Я использовал для этого BufferBlock
и TransformBlock
. Позже в своем коде я жду завершения TransformBlock
. Однако блок никогда не завершается, и я не понимаю почему.
static void Main(string[] args)
{
var bufferBlock = new BufferBlock<int>();
var calculatorBlock = new TransformBlock<int, int>(i =>
{
Console.WriteLine("Calculating {0}²", i);
return (int)Math.Pow(i, 2);
}, new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 8 });
using (bufferBlock.LinkTo(calculatorBlock, new DataflowLinkOptions { PropagateCompletion = true }))
{
foreach (var number in Enumerable.Range(1, 1000))
{
bufferBlock.Post(number);
}
bufferBlock.Complete();
// This line never completes
calculatorBlock.Completion.Wait();
// Unreachable code
IList<int> results;
if (calculatorBlock.TryReceiveAll(out results))
{
foreach (var result in results)
{
Console.WriteLine("x² = {0}", result);
}
}
}
}
Сначала я подумал, что создал тупиковую ситуацию, но это не похоже на правду. Когда я проверил задачу calculatorBlock.Completion
в отладчике, ее свойство Status
было установлено на WaitingForActivation
. Это был момент, когда мой мозг показался синим.