[英]C# TPL Dataflow - Completion not working
該代碼永遠不會到達最后一行,因為完成不會從saveBlock傳播到sendBlock。 我究竟做錯了什么?
var readGenerateBlock = new TransformBlock<int, int>(n =>
{
Console.WriteLine("Read " + n);
Thread.Sleep(15);
return n;
});
var groupingBlock = new BatchBlock<int>(10);
var saveBlock = new TransformManyBlock<int[], int>(n =>
{
Console.WriteLine("Saving {0} items [{1}; {2}]", n.Count(), n.First(), n.Last());
Thread.Sleep(150);
return n;
});
var sendBlock = new TransformBlock<int, int>(n =>
{
Console.WriteLine("Sending {0}", n);
Thread.Sleep(25);
return n;
}, new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 2 });
readGenerateBlock.LinkTo(groupingBlock, new DataflowLinkOptions { PropagateCompletion = true });
groupingBlock.LinkTo(saveBlock, new DataflowLinkOptions { PropagateCompletion = true });
saveBlock.LinkTo(sendBlock, new DataflowLinkOptions { PropagateCompletion = true });
Parallel.For(0, 250, i => readGenerateBlock.Post(i));
readGenerateBlock.Complete();
sendBlock.Completion.Wait();
Console.WriteLine("Completed.");
您必須先從數據塊中讀取數據,然后才能完成數據。 由於noöne正在讀取saveBlock
,它將永遠不會完成。
如果不需要數據,最簡單的解決方案是使用ActionBlock
而不是TransformBlock
。 否則,只需繼續讀取數據,直到完成該塊。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.