using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; namespace ConsoleApp22 { class Program { internal class WorkTasksState { private int _inProgress = 0; public void AddTask() => Interlocked.Increment(ref _inProgress); public void SignalComplete() => Interlocked.Decrement(ref _inProgress); public bool AllDone => _inProgress == 0; public async Task WaitComplete() { while (!AllDone) { await Task.Delay(1); } } } static async Task Main() { while (true) { Console.WriteLine("Loop"); WorkTasksState state = new(); for(int i = 0; i < 2048; i++) { state.AddTask(); ThreadPool.QueueUserWorkItem(Foo, state); } await state.WaitComplete(); } } private static async void Foo(object? state) { var s = state as WorkTasksState; Console.WriteLine($"Start Foo in {Thread.CurrentThread.ManagedThreadId}"); Random rnd = new(); List temp = new(); for(int i = 0; i < 1024; i++) { await Task.Yield(); byte[] buffer = new byte[1024]; temp.Add(buffer); } List sums = new(); foreach(var item in temp) { await Task.Yield(); rnd.NextBytes(item); var sum = item.Sum(x=>x); sums.Add(sum); } //Раскоментируй и сравни //GC.Collect(); Console.WriteLine($"Complete in {Thread.CurrentThread.ManagedThreadId}"); s.SignalComplete(); } } }