簡體   English   中英

C#TPL數據流-完成不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM