using System.Threading.Tasks;
using System.Threading.Tasks.Dataflow;
public static async Task Main()
var xlsBlock = new TransformBlock<int, int>(document =>
int duration = 300 + document % 3 * 300;
var pdfBlock = new TransformBlock<int, int>(document =>
int duration = 100 + document % 5 * 200;
var uploader = new ActionBlock<int>(async document =>
Console.WriteLine("Uploading document #{0}", document);
xlsBlock.LinkTo(uploader);
pdfBlock.LinkTo(uploader);
foreach (var document in Enumerable.Range(1, 10))
_ = Task.WhenAll(xlsBlock.Completion, pdfBlock.Completion)
.ContinueWith(_ => uploader.Complete());
await uploader.Completion;