Scheduling async Task does not work as I expected in a TPL data stream. In the example below, I expected ActionBlock process data from TransformBlock as soon as it is available. But he waits for the second (delayed) result before he moves on to the third. What am I misunderstood here? Is there any requirement for processing order?
public class TestDataFlow { public System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch(); public async Task Flow() { watch.Start(); var plus10 = new TransformBlock<int, int>(async input => { if (input == 2) { await Task.Delay(5000); } Console.WriteLine("Exiting plus10 for input {0} @ {1}", input, watch.Elapsed); return input + 10; }, new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 4, }); var printSolution = new ActionBlock<int>(input => { Console.WriteLine("Solution: {0} @ {1}", input, watch.Elapsed.TotalMilliSeconds); }, new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 4, }); plus10.LinkTo(printSolution); List<int> inputs = new List<int> { 1, 2, 3 }; foreach (var input in inputs) { await plus10.SendAsync(input); } } }
Conclusion:
Exiting plus10 for input 1 @ 115.8583 Exiting plus10 for input 3 @ 116.6973 Solution: 11 @ 126.0146 Exiting plus10 for input 2 @ 5124.4074 Solution: 12 @ 5124.9014 Solution: 13 @ 5126.4834
source share