2015-08-10 4 views
1

Этот код никогда не доходит до последней строки, потому что завершение не распространяется из saveBlock в sendBlock. Что я делаю не так?C# TPL Dataflow - Completion не работает

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."); 

ответ

3

Вы должны прочитать данные из блока до его завершения. Поскольку noöne читает saveBlock, он никогда не будет завершен.

Если вам не нужны данные, самым простым решением является использование ActionBlock вместо TransformBlock. В противном случае просто продолжайте читать данные до тех пор, пока блок не будет завершен.

Смежные вопросы