public async Task TestMutlipleHitsAsync()
        {
            var taskTokens = new List <Task>();
            var result     = string.Empty;
            var task       = new Interceptor <string>(
                v => result = v,
                InterceptorPolicy.Mutliple(2, 4, TimeSpan.FromMilliseconds(100))
                );

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

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

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

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

            Assert.AreEqual("lmn", result);
            _ = task.InvokeAsync("opq");
            await Task.Delay(110);

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

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

            Assert.AreEqual("uvw", result);
            _ = task.InvokeAsync("xyz");
            await Task.Delay(20);

            Assert.AreEqual("xyz", result);
            await task.WaitAsync();

            Assert.IsFalse(task.IsWorking);
        }
 /// <summary>
 /// Creates a multi-hit interceptor policy.
 /// </summary>
 /// <param name="action">The action to register to execute.</param>
 /// <param name="min">The minmum invoking count.</param>
 /// <param name="max">The maxmum invoking count.</param>
 /// <param name="timeout">The time span between each invoking.</param>
 /// <returns>The action with the specific interceptor policy integration.</returns>
 /// <remark>
 /// The handler to process for the specific times and it will be reset after a while.
 /// </remark>
 public static Func <T, Task> Mutliple(Func <T, Task> action, int min, int?max, TimeSpan timeout)
 => Action(action, InterceptorPolicy.Mutliple(min, max, timeout));
 /// <summary>
 /// Creates a multi-hit interceptor policy.
 /// </summary>
 /// <param name="action">The action to register to execute.</param>
 /// <param name="min">The minmum invoking count.</param>
 /// <param name="max">The maxmum invoking count.</param>
 /// <param name="timeout">The time span between each invoking.</param>
 /// <returns>The action with the specific interceptor policy integration.</returns>
 /// <remark>
 /// The handler to process for the specific times and it will be reset after a while.
 /// </remark>
 public static Action <T> Mutliple(Action <T> action, int min, int?max, TimeSpan timeout)
 => Action(action, InterceptorPolicy.Mutliple(min, max, timeout));
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");
        }