using System.Collections.Generic;
using System.Threading.Tasks;
public static async Task Main()
var p = new Progress<int>();
p.ProgressChanged += P_ProgressChanged;
for (int i = 0; i < 10; i++)
private static void P_ProgressChanged(object sender, int e)
public static async Task DoStuffAsync(IProgress<int> progress)
int totalPercentDone = 0;
var semaphore = new SemaphoreSlim(1,1);
Task[] tasks = Enumerable.Range(1, 2).Select(n => Task.Run(async () =>
for (int i = 0; i < 5; i++)
await semaphore.WaitAsync();
progress.Report(totalPercentDone);
await Task.WhenAll(tasks);