From 8c8e0ec26112437e2be2f0dc254183cc7c01c16f Mon Sep 17 00:00:00 2001 From: Fernando Cerqueira Date: Wed, 9 Apr 2025 13:55:51 -0300 Subject: [PATCH] improvements to manual scale examples --- .../RingBufferPlusBasicManualScale/Program.cs | 118 +++++++++++++++++- 1 file changed, 117 insertions(+), 1 deletion(-) diff --git a/samples/RingBufferPlusBasicManualScale/Program.cs b/samples/RingBufferPlusBasicManualScale/Program.cs index 15d264c..1c4e005 100644 --- a/samples/RingBufferPlusBasicManualScale/Program.cs +++ b/samples/RingBufferPlusBasicManualScale/Program.cs @@ -26,7 +26,7 @@ public static async Task Main(string[] args) Random rnd = new(); //token to app control gracefull shutdown - using var cts = new CancellationTokenSource(); + var cts = new CancellationTokenSource(); var rb = await RingBuffer.New("MyBuffer") .Capacity(6) @@ -43,6 +43,8 @@ public static async Task Main(string[] args) Console.WriteLine($"Ring Buffer name({rb.Name}) IsMaxCapacity = {rb.IsMaxCapacity}."); Console.WriteLine($"Ring Buffer name({rb.Name}) IsMinCapacity = {rb.IsMinCapacity}."); + Console.WriteLine("Starting Manual scale with non lock"); + Console.WriteLine("Swith to MinCapacity"); await rb.SwitchToAsync(ScaleSwitch.MinCapacity); var sw = Stopwatch.StartNew(); @@ -134,6 +136,120 @@ public static async Task Main(string[] args) Console.WriteLine($"Ring Buffer Current is {rb.CurrentCapacity}"); } sw.Reset(); + + cts.Dispose(); + + Console.WriteLine("Starting Manual scale with lock"); + + cts = new CancellationTokenSource(); + + rb = await RingBuffer.New("MyBuffer") + .Capacity(6) + .Logger(HostApp.Services.GetService>()) + .Factory((_) => { return Task.FromResult(rnd.Next(1, 10)); }) + .ScaleTimer() + .LockWhenScaling() + .MinCapacity(3) + .MaxCapacity(9) + .BuildWarmupAsync(cts.Token); + + Console.WriteLine($"Ring Buffer name({rb.Name}) created."); + Console.WriteLine($"Ring Buffer Current capacity is : {rb.CurrentCapacity}"); + Console.WriteLine($"Ring Buffer name({rb.Name}) IsInitCapacity = {rb.IsInitCapacity}."); + Console.WriteLine($"Ring Buffer name({rb.Name}) IsMaxCapacity = {rb.IsMaxCapacity}."); + Console.WriteLine($"Ring Buffer name({rb.Name}) IsMinCapacity = {rb.IsMinCapacity}."); + + Console.WriteLine("Swith to MinCapacity"); + await rb.SwitchToAsync(ScaleSwitch.MinCapacity); + sw.Start(); + while (sw.ElapsedMilliseconds < 5000) + { + Thread.Sleep(1000); + Console.WriteLine($"Ring Buffer Current capacity switch to {rb.CurrentCapacity}"); + } + sw.Reset(); + Console.WriteLine($"Ring Buffer name({rb.Name}) IsInitCapacity = {rb.IsInitCapacity}."); + Console.WriteLine($"Ring Buffer name({rb.Name}) IsMaxCapacity = {rb.IsMaxCapacity}."); + Console.WriteLine($"Ring Buffer name({rb.Name}) IsMinCapacity = {rb.IsMinCapacity}."); + + Console.WriteLine("Swith to MaxCapacity"); + await rb.SwitchToAsync(ScaleSwitch.MaxCapacity); + sw.Start(); + while (sw.ElapsedMilliseconds < 5000) + { + Thread.Sleep(1000); + Console.WriteLine($"Ring Buffer Current capacity switch to {rb.CurrentCapacity}"); + } + sw.Reset(); + Console.WriteLine($"Ring Buffer name({rb.Name}) IsInitCapacity = {rb.IsInitCapacity}."); + Console.WriteLine($"Ring Buffer name({rb.Name}) IsMaxCapacity = {rb.IsMaxCapacity}."); + Console.WriteLine($"Ring Buffer name({rb.Name}) IsMinCapacity = {rb.IsMinCapacity}."); + + Console.WriteLine("Swith to initial Capacity"); + await rb.SwitchToAsync(ScaleSwitch.InitCapacity); + sw.Start(); + while (sw.ElapsedMilliseconds < 5000) + { + Thread.Sleep(1000); + Console.WriteLine($"Ring Buffer Current capacity switch to {rb.CurrentCapacity}"); + } + sw.Reset(); + Console.WriteLine($"Ring Buffer name({rb.Name}) IsInitCapacity = {rb.IsInitCapacity}."); + Console.WriteLine($"Ring Buffer name({rb.Name}) IsMaxCapacity = {rb.IsMaxCapacity}."); + Console.WriteLine($"Ring Buffer name({rb.Name}) IsMinCapacity = {rb.IsMinCapacity}."); + + Console.WriteLine("Swith to MaxCapacity"); + await rb.SwitchToAsync(ScaleSwitch.MaxCapacity); + sw.Start(); + while (sw.ElapsedMilliseconds < 5000) + { + Thread.Sleep(1000); + Console.WriteLine($"Ring Buffer Current capacity switch to {rb.CurrentCapacity}"); + } + sw.Reset(); + Console.WriteLine($"Ring Buffer name({rb.Name}) IsInitCapacity = {rb.IsInitCapacity}."); + Console.WriteLine($"Ring Buffer name({rb.Name}) IsMaxCapacity = {rb.IsMaxCapacity}."); + Console.WriteLine($"Ring Buffer name({rb.Name}) IsMinCapacity = {rb.IsMinCapacity}."); + + Console.WriteLine("Swith to MinCapacity"); + await rb.SwitchToAsync(ScaleSwitch.MinCapacity); + sw.Start(); + while (sw.ElapsedMilliseconds < 5000) + { + Thread.Sleep(1000); + Console.WriteLine($"Ring Buffer Current capacity switch to {rb.CurrentCapacity}"); + } + sw.Reset(); + Console.WriteLine($"Ring Buffer name({rb.Name}) IsInitCapacity = {rb.IsInitCapacity}."); + Console.WriteLine($"Ring Buffer name({rb.Name}) IsMaxCapacity = {rb.IsMaxCapacity}."); + Console.WriteLine($"Ring Buffer name({rb.Name}) IsMinCapacity = {rb.IsMinCapacity}."); + + Console.WriteLine("Swith to defaut Capacity"); + await rb.SwitchToAsync(ScaleSwitch.InitCapacity); + sw.Start(); + while (sw.ElapsedMilliseconds < 5000) + { + Thread.Sleep(1000); + Console.WriteLine($"Ring Buffer Current capacity switch to {rb.CurrentCapacity}"); + } + sw.Reset(); + Console.WriteLine($"Ring Buffer name({rb.Name}) IsInitCapacity = {rb.IsInitCapacity}."); + Console.WriteLine($"Ring Buffer name({rb.Name}) IsMaxCapacity = {rb.IsMaxCapacity}."); + Console.WriteLine($"Ring Buffer name({rb.Name}) IsMinCapacity = {rb.IsMinCapacity}."); + + Console.WriteLine("Dispose ring buffer"); + + cts.Cancel(); + + Console.WriteLine($"Dispose Ring Buffer..."); + cts.Cancel(); + sw.Start(); + while (sw.ElapsedMilliseconds < 5000) + { + Thread.Sleep(1000); + Console.WriteLine($"Ring Buffer Current is {rb.CurrentCapacity}"); + } + sw.Reset(); } private static IHostBuilder CreateHostBuilder(string[] args) =>