/ Framework / Utils / TaskFactory.cs
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  }