public async Task TestDebounceAsync()
        {
            var result = string.Empty;
            var task   = new Interceptor <string>(
                v => result = v,
                InterceptorPolicy.Debounce(TimeSpan.FromMilliseconds(100))
                );

            Assert.IsFalse(task.IsWorking);
            _ = task.InvokeAsync("abc");
            Assert.IsTrue(task.IsWorking);
            await Task.Delay(20);

            Assert.AreEqual(string.Empty, result);
            _ = task.InvokeAsync("defg");
            await Task.Delay(20);

            Assert.AreEqual(string.Empty, result);
            _ = task.InvokeAsync("hijk");
            await Task.Delay(20);

            Assert.AreEqual(string.Empty, result);
            _ = task.InvokeAsync("lmn");
            await Task.Delay(20);

            Assert.AreEqual(string.Empty, result);
            await Task.Delay(90);

            if (string.IsNullOrEmpty(result))
            {
                await Task.Delay(20);
            }
            Assert.AreEqual("lmn", result);
            await task.WaitAsync();

            Assert.IsFalse(task.IsWorking);
        }
 /// <summary>
 /// Creates a debounce interceptor policy.
 /// </summary>
 /// <param name="action">The action to register to execute.</param>
 /// <param name="delay">Delay time span.</param>
 /// <returns>The interceptor policy.</returns>
 /// <remarks>
 /// Maybe a handler will be asked to process several times in a short time
 /// but you just want to process once at the last time because the previous ones are obsolete.
 /// A sample scenario is real-time search.
 /// </remarks>
 public static Func <T, Task> Debounce(Func <T, Task> action, TimeSpan delay)
 => Action(action, InterceptorPolicy.Debounce(delay));
 /// <summary>
 /// Creates a debounce interceptor policy.
 /// </summary>
 /// <param name="action">The action to register to execute.</param>
 /// <param name="delay">Delay time span.</param>
 /// <returns>The interceptor policy.</returns>
 /// <remarks>
 /// Maybe a handler will be asked to process several times in a short time
 /// but you just want to process once at the last time because the previous ones are obsolete.
 /// A sample scenario is real-time search.
 /// </remarks>
 public static Action <T> Debounce(Action <T> action, TimeSpan delay)
 => Action(action, InterceptorPolicy.Debounce(delay));
Exemple #4
0
        private async Task TestKeyFeaturesAsync()
        {
            Console.WriteLine("Interceptor testing.");

            Console.WriteLine("Debounce");
            var task = new Interceptor <string>(
                v => value = v,
                InterceptorPolicy.Debounce(TimeSpan.FromMilliseconds(200))
                );

            _ = task.InvokeAsync("b");
            await Task.Delay(100);

            _ = task.InvokeAsync("c");
            await Task.Delay(100);

            _ = task.InvokeAsync("d");
            await Task.Delay(100);

            _ = task.InvokeAsync("e");
            Check("a");
            await Task.Delay(300);

            Check("e");
            await task.WaitAsync();

            Check("e");

            Console.WriteLine("Throttle");
            task.ResetDuration();
            task.Policy = InterceptorPolicy.Throttle(TimeSpan.FromMilliseconds(800));
            _           = task.InvokeAsync("f");
            await Task.Delay(100);

            _ = task.InvokeAsync("g");
            await Task.Delay(100);

            _ = task.InvokeAsync("h");
            await Task.Delay(100);

            _ = task.InvokeAsync("i");
            await Task.Delay(100);

            Check("f");
            await task.WaitAsync();

            Check("f");

            Console.WriteLine("Multiple");
            task.ResetDuration();
            task.Policy = InterceptorPolicy.Mutliple(2, 4, TimeSpan.FromMilliseconds(200));
            _           = task.InvokeAsync("j");
            Check("f");
            await Task.Delay(100);

            _ = task.InvokeAsync("k");
            Check("k");
            await Task.Delay(100);

            _ = task.InvokeAsync("l");
            await Task.Delay(100);

            _ = task.InvokeAsync("m");
            await Task.Delay(100);

            Check("m");
            _ = task.InvokeAsync("n");
            await Task.Delay(100);

            Check("m");
            await task.WaitAsync();

            Check("m");

            Console.WriteLine("Times 1");
            task.ResetDuration();
            task.Policy = InterceptorPolicy.Times(2, 3, TimeSpan.FromMilliseconds(200));
            _           = task.InvokeAsync("o");
            Check("m");
            await Task.Delay(100);

            _ = task.InvokeAsync("p");
            Check("m");
            await Task.Delay(100);

            _ = task.InvokeAsync("q");
            await Task.Delay(100);

            _ = task.InvokeAsync("r");
            await Task.Delay(100);

            Check("m");
            _ = task.InvokeAsync("s");
            await Task.Delay(100);

            Check("m");
            await task.WaitAsync();

            Check("m");

            Console.WriteLine("Times 2");
            task.ResetDuration();
            task.Policy = InterceptorPolicy.Times(2, 3, TimeSpan.FromMilliseconds(200));
            _           = task.InvokeAsync("t");
            Check("m");
            await Task.Delay(100);

            _ = task.InvokeAsync("u");
            Check("m");
            await Task.Delay(100);

            _ = task.InvokeAsync("v");
            await Task.Delay(100);

            Check("m");
            await task.WaitAsync();

            Check("v");
        }