ModernUO/Projects/Server/Tasks/TaskExtensions.cs
2026-04-09 16:05:47 -06:00

48 lines
1.9 KiB
C#

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