namespace RemoteExec.Server.Utilities; public class CompletableEventArgs : EventArgs { private readonly TaskCompletionSource tcs = new(TaskCreationOptions.RunContinuationsAsynchronously); public void SetCompleted() { _ = tcs.TrySetResult(true); } public Task WaitAsync(CancellationToken cancellationToken = default) { if (cancellationToken.CanBeCanceled) { _ = cancellationToken.Register(() => tcs.TrySetCanceled(cancellationToken)); } return tcs.Task; } } public class CompletableEventArgs : EventArgs { private readonly TaskCompletionSource tcs = new(TaskCreationOptions.RunContinuationsAsynchronously); public void SetCompleted(T result) { _ = tcs.TrySetResult(result); } public Task WaitAsync(CancellationToken cancellationToken = default) { if (cancellationToken.CanBeCanceled) { _ = cancellationToken.Register(() => tcs.TrySetCanceled(cancellationToken)); } return tcs.Task; } } public class CompletableEventArgs(TValue value) { public TValue Value { get; } = value; private readonly TaskCompletionSource tcs = new(TaskCreationOptions.RunContinuationsAsynchronously); public void SetCompleted(TResult result) { _ = tcs.TrySetResult(result); } public Task WaitAsync(CancellationToken cancellationToken = default) { if (cancellationToken.CanBeCanceled) { _ = cancellationToken.Register(() => tcs.TrySetCanceled(cancellationToken)); } return tcs.Task; } }