using System; using System.Collections.Generic; using System.Text; using System.Threading.Tasks; namespace Barotrauma { public static class TaskPool { private struct TaskAction { public Task Task; public Action OnCompletion; public object UserData; } private static List taskActions = new List(); private static void AddInternal(Task task, Action onCompletion, object userdata) { lock (taskActions) { taskActions.Add(new TaskAction() { Task = task, OnCompletion = onCompletion, UserData = userdata }); } } public static void Add(Task task, Action onCompletion) { AddInternal(task, (Task t, object obj) => { onCompletion(t); }, null); } public static void Add(Task task, U userdata, Action onCompletion) where U : class { AddInternal(task, (Task t, object obj) => { onCompletion(t, (U)obj); }, userdata); } public static void Add(Task task, Action> onCompletion) { AddInternal(task, (Task t, object obj) => { onCompletion((Task)t); }, null); } public static void Add(Task task, U userdata, Action, U> onCompletion) where U : class { AddInternal(task, (Task t, object obj) => { onCompletion((Task)t, (U)obj); }, userdata); } public static void Update() { lock (taskActions) { for (int i = 0; i < taskActions.Count; i++) { if (taskActions[i].Task.IsCompleted) { taskActions[i].OnCompletion?.Invoke(taskActions[i].Task, taskActions[i].UserData); taskActions.RemoveAt(i); i--; } } } } public static void PrintTaskExceptions(Task task, string msg) { DebugConsole.ThrowError(msg); foreach (Exception e in task.Exception.InnerExceptions) { DebugConsole.ThrowError(e.Message + "\n" + e.StackTrace); } } } }