namespace RemoteExec.Client; internal class AsyncManualResetEvent { private volatile TaskCompletionSource _tcs = new(TaskCreationOptions.RunContinuationsAsynchronously); public AsyncManualResetEvent(bool initialState) { if (initialState) { _ = _tcs.TrySetResult(true); } } public Task WaitAsync(CancellationToken ct) { return _tcs.Task.WaitAsync(ct); } public void Set() { _ = _tcs.TrySetResult(true); } public void Reset() { while (true) { TaskCompletionSource tcs = _tcs; if (!tcs.Task.IsCompleted || Interlocked.CompareExchange(ref _tcs, new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously), tcs) == tcs) { return; } } } }