using System; using System.Threading; using System.Threading.Tasks; namespace Server.Tasks; public static class TaskExtensions { public static void OnFaultedCurrentSyncContext(this Task task, Action onFaulted, CancellationToken cancellationToken = default) { var scheduler = TaskScheduler.FromCurrentSynchronizationContext(); task.ContinueWith(onFaulted, cancellationToken, TaskContinuationOptions.OnlyOnFaulted, scheduler); } public static void ContinueWithOnCurrentSyncContext( this Task task, Action> onRanToCompletion, Action> onFaulted, CancellationToken cancellationToken = default ) { var scheduler = TaskScheduler.FromCurrentSynchronizationContext(); task.ContinueWith(onRanToCompletion, cancellationToken, TaskContinuationOptions.OnlyOnRanToCompletion, scheduler); task.ContinueWith(onFaulted, cancellationToken, TaskContinuationOptions.OnlyOnFaulted, scheduler); } public static void ContinueWithOnCurrentSyncContext( this Task task, Action> onCompletion, CancellationToken cancellationToken = default ) { var scheduler = TaskScheduler.FromCurrentSynchronizationContext(); task.ContinueWith(onCompletion, cancellationToken, TaskContinuationOptions.None, scheduler); } public static void ContinueWithOnGameThread( this Task task, Action> onCompletion, CancellationToken cancellationToken = default ) => task.ContinueWith(onCompletion, cancellationToken, TaskContinuationOptions.None, Core.LoopContextTaskScheduler); public static void ContinueWithOnGameThread( this Task task, Action onCompletion, CancellationToken cancellationToken = default ) => task.ContinueWith(onCompletion, cancellationToken, TaskContinuationOptions.None, Core.LoopContextTaskScheduler); }