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); }
/// <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); }
/// <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); }
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); }
public void HasChangeFiresChange() { var token = new TestChangeToken(); bool fired = false; ChangeToken.OnChange(() => token, () => fired = true); Assert.False(fired); token.Changed(); Assert.True(fired); }
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); }
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); }
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); }
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); }
public void NullTokenDisposeShouldNotThrow() { ChangeToken.OnChange(() => null, () => Assert.True(false)).Dispose(); }