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<byte[]> temp = new();
for(int i = 0; i < 1024; i++)
{
await Task.Yield();
byte[] buffer = new byte[1024];
temp.Add(buffer);
}
List<decimal> 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();
}
}
}