TaskFactory.cs
1 namespace Utils 2 { 3 public class TaskFactory 4 { 5 private readonly object taskLock = new(); 6 private readonly List<Task> activeTasks = new List<Task>(); 7 8 public void Run(Action action, string name) 9 { 10 lock (taskLock) 11 { 12 activeTasks.Add(Task.Run(() => CatchException(action, name)).ContinueWith(CleanupTask, null)); 13 } 14 } 15 16 private void CatchException(Action action, string name) 17 { 18 try 19 { 20 action(); 21 } 22 catch (Exception ex) 23 { 24 Console.WriteLine($"Exception in task '{name}': " + ex); 25 } 26 } 27 28 public void WaitAll() 29 { 30 var tasks = activeTasks.ToArray(); 31 Task.WaitAll(tasks); 32 33 var moreTasks = false; 34 lock (taskLock) 35 { 36 activeTasks.RemoveAll(task => task.IsCompleted); 37 moreTasks = activeTasks.Any(); 38 } 39 40 if (moreTasks) WaitAll(); 41 } 42 43 private void CleanupTask(Task completedTask, object? arg) 44 { 45 lock (taskLock) 46 { 47 activeTasks.Remove(completedTask); 48 } 49 } 50 } 51 }