public async Task <bool> WaitAsync(CancellationToken cancellationToken = default) { var queue = new TaskCompletionQueuedSource <T>(); void SubscribeOnChange(T newValue) => queue.NewData(newValue); try { OnChange.Add(SubscribeOnChange); if (await queue.WaitValueAsync(cancellationToken).ConfigureAwait(false) is var result && result.Ok) { Value = result.Value; } return(result.Ok); } finally { OnChange.Remove(SubscribeOnChange); } }
public async Task <bool> WaitValueAsync(T[] waitValues, CancellationToken cancellationToken = default) { if (waitValues is null || waitValues.Length == 0) { return(false); } var queue = new TaskCompletionQueuedSource <T>(); if (waitValues.Contains(Value)) { return(true); } void SubscribeOnChange(T newValue) => queue.NewData(newValue); try { OnChange.Add(SubscribeOnChange); bool running = true; while (running) { if (await queue.WaitValueAsync(cancellationToken).ConfigureAwait(false) is var result && result.Ok) { if (waitValues.Contains(result.Value)) { return(true); } } else { running = false; } if (cancellationToken.IsCancellationRequested) { running = false; } }