Example #1
0
        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);
            }
        }
Example #2
0
        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;
                    }
                }