Пример #1
0
        public void DisposingChangeTokenRegistrationDoesNotRaiseConsumerCallbackStateOverload()
        {
            var provider = new ResettableChangeTokenProvider();
            var count    = 0;
            var reg      = ChangeToken.OnChange <object>(provider.GetChangeToken, state =>
            {
                count++;
            },
                                                         null);

            for (int i = 0; i < 5; i++)
            {
                provider.Changed();
            }

            Assert.Equal(5, count);

            reg.Dispose();

            for (int i = 0; i < 5; i++)
            {
                provider.Changed();
            }

            Assert.Equal(5, count);
        }
Пример #2
0
        /// <summary>
        /// Handle <see cref="ChangeToken.OnChange(Func{IChangeToken}, Action)"/> after a delay that discards any duplicate invocations within that period of time.
        /// Useful for working around issue like described here: https://github.com/aspnet/AspNetCore/issues/2542
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="changeTokenFactory"></param>
        /// <param name="listener"></param>
        /// <param name="state"></param>
        /// <param name="delay"></param>
        /// <returns></returns>
        public static IDisposable OnChangeDebounce(Func <IChangeToken> changeTokenFactory, Action listener, int delayInMilliseconds = DefaultDelayInMilliseconds)
        {
            var debouncer = new Debouncer(TimeSpan.FromMilliseconds(delayInMilliseconds));
            var token     = ChangeToken.OnChange(changeTokenFactory, () => debouncer.Debouce(listener));

            return(token);
        }
Пример #3
0
        /// <summary>
        /// Handle <see cref="ChangeToken.OnChange{TState}(Func{IChangeToken}, Action{TState}, TState)"/> after a delay that discards any duplicate invocations within that period of time.
        /// Useful for working around issue like described here: https://github.com/aspnet/AspNetCore/issues/2542
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="changeTokenFactory"></param>
        /// <param name="listener"></param>
        /// <param name="state"></param>
        /// <param name="delay"></param>
        /// <returns></returns>
        public static IDisposable OnChangeDebounce <T>(Func <IChangeToken> changeTokenFactory, Action <T> listener, T state, int delayInMilliseconds = DefaultDelayInMilliseconds)
        {
            var debouncer = new Debouncer <T>(TimeSpan.FromMilliseconds(delayInMilliseconds));
            var token     = ChangeToken.OnChange <T>(changeTokenFactory, s => debouncer.Debounce(listener, s), state);

            return(token);
        }
Пример #4
0
        public void DoubleDisposeDisposesOnce()
        {
            var provider = new TrackableChangeTokenProvider();
            var count    = 0;

            IDisposable reg = null;

            reg = ChangeToken.OnChange <object>(provider.GetChangeToken, state =>
            {
                count++;
                reg.Dispose();
            },
                                                null);

            provider.Changed();

            Assert.Equal(1, count);
            Assert.Equal(1, provider.RegistrationCalls);
            Assert.Equal(1, provider.DisposeCalls);

            reg.Dispose();

            provider.Changed();

            Assert.Equal(1, count);
            Assert.Equal(2, provider.RegistrationCalls);
            Assert.Equal(2, provider.DisposeCalls);
        }
Пример #5
0
        public void HasChangeFiresChange()
        {
            var  token = new TestChangeToken();
            bool fired = false;

            ChangeToken.OnChange(() => token, () => fired = true);
            Assert.False(fired);
            token.Changed();
            Assert.True(fired);
        }
Пример #6
0
        public void HasChangeFiresChangeWithState()
        {
            var    token         = new TestChangeToken();
            object state         = new object();
            object callbackState = null;

            ChangeToken.OnChange(() => token, s => callbackState = s, state);
            Assert.Null(callbackState);
            token.Changed();
            Assert.Equal(state, callbackState);
        }
Пример #7
0
        public void ChangesFireAfterExceptions()
        {
            TestChangeToken token = null;
            var             count = 0;

            ChangeToken.OnChange(() => token = new TestChangeToken(), () =>
            {
                count++;
                throw new Exception();
            });
            Assert.Throws <Exception>(() => token.Changed());
            Assert.Equal(1, count);
            Assert.Throws <Exception>(() => token.Changed());
            Assert.Equal(2, count);
        }
Пример #8
0
        public void ChangesFireAfterExceptionsWithState()
        {
            TestChangeToken token         = null;
            var             count         = 0;
            object          state         = new object();
            object          callbackState = null;

            ChangeToken.OnChange(() => token = new TestChangeToken(), s =>
            {
                callbackState = s;
                count++;
                throw new Exception();
            }, state);
            Assert.Throws <Exception>(() => token.Changed());
            Assert.Equal(1, count);
            Assert.NotNull(callbackState);
            Assert.Throws <Exception>(() => token.Changed());
            Assert.Equal(2, count);
            Assert.NotNull(callbackState);
        }
Пример #9
0
        public void DisposingChangeTokenRegistrationDuringCallbackWorks()
        {
            var provider = new ResettableChangeTokenProvider();
            var count    = 0;

            IDisposable reg = null;

            reg = ChangeToken.OnChange <object>(provider.GetChangeToken, state =>
            {
                count++;
                reg.Dispose();
            },
                                                null);

            provider.Changed();

            Assert.Equal(1, count);

            provider.Changed();

            Assert.Equal(1, count);
        }
Пример #10
0
 public void NullTokenDisposeShouldNotThrow()
 {
     ChangeToken.OnChange(() => null, () => Assert.True(false)).Dispose();
 }