using System.Threading.Tasks;
using System.Threading.Tasks.Dataflow;
public static void Main()
var block1 = new TransformBlock<char, char>(item =>
Console.WriteLine($"Block-1 processing {item}");
var block2 = new TransformBlock<char, char>(item =>
Console.WriteLine($"Block-2 processing {item}");
var block3 = new ActionBlock<char>(item =>
Console.WriteLine($"Block-3 processing {item}");
block1.LinkTo(block2, new() { PropagateCompletion = true });
block2.PropagateFailure(block1);
block2.LinkTo(block3, new() { PropagateCompletion = true });
block3.PropagateFailure(block2);
Task whenAll = Task.WhenAll(block1.Completion, block2.Completion, block3.Completion);
try { whenAll.Wait(1000); } catch { }
Console.WriteLine("Task.WhenAll " + (whenAll.IsCompleted ? "Completed" : "Timed-out"));
static async void PropagateFailure(this IDataflowBlock block1, IDataflowBlock block2)
try { await block1.Completion.ConfigureAwait(false); } catch { }
if (block1.Completion.IsFaulted) block2.Fault(block1.Completion.Exception);