using System.Collections.Generic;
using System.Threading.Tasks;
static Dictionary<string, bool> map = new Dictionary<string, bool>();
static async Task Runner()
Console.WriteLine("Started runner");
for (var i=0; i < 100; i++)
map[i.ToString()] = true;
static async Task Checker(CancellationToken cancellationToken)
Console.WriteLine("Started checker");
while (!cancellationToken.IsCancellationRequested)
var result = map.Count == 0 ? true : !map.ContainsValue(false);
Console.WriteLine("All tasks are finished.");
Console.WriteLine("All tasks are not finished.");
public static void Main()
var cts = new CancellationTokenSource();
var tasks = new List<Task>();
var checker = Task.Run(async () => await Checker(cts.Token));
for (var i=0; i < 50; i++)
tasks.Add(Task.Run(Runner));
Task.WhenAll(tasks).GetAwaiter().GetResult();
checker.GetAwaiter().GetResult();