From 769f98905bd75f22db2da2b7dfa891cf49542492 Mon Sep 17 00:00:00 2001 From: Michael Mortensen Date: Fri, 13 Jun 2025 22:59:53 +0200 Subject: [PATCH 01/17] :sparkles: Awaiter.RunUntilSucceededOrTimeoutAsync --- src/Cuemon.Core/Threading/AsyncOptions.cs | 2 +- src/Cuemon.Core/Threading/AsyncRunOptions.cs | 49 +++++++++++++++ src/Cuemon.Core/Threading/Awaiter.cs | 64 ++++++++++++++++++++ 3 files changed, 114 insertions(+), 1 deletion(-) create mode 100644 src/Cuemon.Core/Threading/AsyncRunOptions.cs create mode 100644 src/Cuemon.Core/Threading/Awaiter.cs diff --git a/src/Cuemon.Core/Threading/AsyncOptions.cs b/src/Cuemon.Core/Threading/AsyncOptions.cs index 60961d4eb..1c2ceb61c 100644 --- a/src/Cuemon.Core/Threading/AsyncOptions.cs +++ b/src/Cuemon.Core/Threading/AsyncOptions.cs @@ -34,7 +34,7 @@ public class AsyncOptions : IAsyncOptions, IParameterObject /// public AsyncOptions() { - CancellationToken = default; + CancellationToken = CancellationToken.None; } /// diff --git a/src/Cuemon.Core/Threading/AsyncRunOptions.cs b/src/Cuemon.Core/Threading/AsyncRunOptions.cs new file mode 100644 index 000000000..c41cdf4bd --- /dev/null +++ b/src/Cuemon.Core/Threading/AsyncRunOptions.cs @@ -0,0 +1,49 @@ +using System; + +namespace Cuemon.Threading +{ + /// + /// Provides options that are related to asynchronous run operations. + /// + /// + public class AsyncRunOptions : AsyncOptions + { + /// + /// Initializes a new instance of the class. + /// + /// + /// The following table shows the initial property values for an instance of . + /// + /// + /// Property + /// Initial Value + /// + /// + /// + /// 00:00:05 (5 seconds) + /// + /// + /// + /// 00:00:00.1000000 (100 milliseconds) + /// + /// + /// + public AsyncRunOptions() + { + Timeout = TimeSpan.FromSeconds(5); + Delay = TimeSpan.FromMilliseconds(100); + } + + /// + /// Gets or sets the timeout for the asynchronous operation. + /// + /// The timeout for the asynchronous operation. The default is 5 seconds. + public TimeSpan Timeout { get; set; } + + /// + /// Gets or sets the delay between asynchronous operation attempts. + /// + /// The delay between asynchronous operation attempts. The default is 100 milliseconds. + public TimeSpan Delay { get; set; } + } +} diff --git a/src/Cuemon.Core/Threading/Awaiter.cs b/src/Cuemon.Core/Threading/Awaiter.cs new file mode 100644 index 000000000..cee7f726a --- /dev/null +++ b/src/Cuemon.Core/Threading/Awaiter.cs @@ -0,0 +1,64 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Threading.Tasks; + +namespace Cuemon.Threading +{ + /// + /// Provides a set of static methods for awaiting asynchronous operations. + /// + public static class Awaiter + { + /// + /// Repeatedly invokes the specified asynchronous until it succeeds or the configured is reached. + /// + /// The asynchronous function delegate to execute, returning a indicating success or failure. + /// The which may be configured. + /// + /// A task that represents the asynchronous operation. The task result contains the returned by the last invocation of , or an unsuccessful value if the timeout is reached. + /// + /// + /// The is invoked repeatedly with a delay specified by until it returns a successful or the timeout specified by is reached. + ///
+ /// Potential exceptions thrown by are caught and collected. If the operation does not succeed before the timeout, will be conditionally initialized:
+ /// 1: No caught exceptions; initialized with default constructor,
+ /// 2: One caught exception; initialized with caught exception,
+ /// 3: Two or more exceptions; initialized with containing all exceptions. + ///
+ public static async Task RunUntilSucceededOrTimeoutAsync(Func> method, Action setup = null) + { + var options = Patterns.Configure(setup); + var stopwatch = Stopwatch.StartNew(); + var exceptions = new List(); + + ConditionalValue conditionalValue = null; + while (stopwatch.Elapsed <= options.Timeout) + { + try + { + options.CancellationToken.ThrowIfCancellationRequested(); + conditionalValue = await method().ConfigureAwait(false); + if (conditionalValue.Succeeded) { break; } + } + catch (Exception ex) + { + exceptions.Add(ex); + } + + await Task.Delay(options.Delay).ConfigureAwait(false); + } + + return (conditionalValue?.Succeeded ?? false) + ? conditionalValue + : GetUnsuccessfulValue(exceptions); + } + + private static ConditionalValue GetUnsuccessfulValue(IList exceptions) + { + if (exceptions.Count == 0) { return new UnsuccessfulValue(); } + if (exceptions.Count == 1) { return new UnsuccessfulValue(exceptions[0]); } + return new UnsuccessfulValue(new AggregateException(exceptions)); + } + } +} From a84a0679b1e405768702b81e1315a80f8eff3e5f Mon Sep 17 00:00:00 2001 From: Michael Mortensen Date: Fri, 13 Jun 2025 23:00:14 +0200 Subject: [PATCH 02/17] :white_check_mark: tests for RunUntilSucceededOrTimeoutAsync --- .../Threading/AwaiterTest.cs | 125 ++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 test/Cuemon.Core.Tests/Threading/AwaiterTest.cs diff --git a/test/Cuemon.Core.Tests/Threading/AwaiterTest.cs b/test/Cuemon.Core.Tests/Threading/AwaiterTest.cs new file mode 100644 index 000000000..c081dccef --- /dev/null +++ b/test/Cuemon.Core.Tests/Threading/AwaiterTest.cs @@ -0,0 +1,125 @@ +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Codebelt.Extensions.Xunit; +using Xunit; + +namespace Cuemon.Threading +{ + public class AwaiterTest : Test + { + [Fact] + public async Task RunUntilSucceededOrTimeoutAsync_ShouldReturnOnImmediateSuccess() + { + // Arrange + var callCount = 0; + Task Method() + { + callCount++; + return Task.FromResult(new SuccessfulValue()); + } + + // Act + var result = await Awaiter.RunUntilSucceededOrTimeoutAsync(Method); + + // Assert + Assert.True(result.Succeeded); + Assert.Equal(1, callCount); + } + + [Fact] + public async Task RunUntilSucceededOrTimeoutAsync_ShouldRetryUntilSuccess() + { + // Arrange + var callCount = 0; + Task Method() + { + callCount++; + if (callCount < 3) + return Task.FromResult(new UnsuccessfulValue()); + return Task.FromResult(new SuccessfulValue()); + } + + // Act + var result = await Awaiter.RunUntilSucceededOrTimeoutAsync(Method, o => + { + o.Timeout = TimeSpan.FromSeconds(2); + o.Delay = TimeSpan.FromMilliseconds(10); + }); + + // Assert + Assert.True(result.Succeeded); + Assert.Equal(3, callCount); + } + + [Fact] + public async Task RunUntilSucceededOrTimeoutAsync_ShouldReturnUnsuccessfulOnTimeout_NoExceptions() + { + // Arrange + Task Method() => Task.FromResult(new UnsuccessfulValue()); + + // Act + var result = await Awaiter.RunUntilSucceededOrTimeoutAsync(Method, o => + { + o.Timeout = TimeSpan.FromMilliseconds(50); + o.Delay = TimeSpan.FromMilliseconds(10); + }); + + // Assert + Assert.False(result.Succeeded); + Assert.Null(result.Failure); + } + + [Fact] + public async Task RunUntilSucceededOrTimeoutAsync_ShouldReturnUnsuccessfulWithSingleException() + { + // Arrange + var ct = new CancellationTokenSource(TimeSpan.FromMilliseconds(25)).Token; + + ; + + // Act + var result = await Awaiter.RunUntilSucceededOrTimeoutAsync(() => Task.FromResult(new UnsuccessfulValue()), o => + { + o.Timeout = TimeSpan.FromMilliseconds(75); + o.Delay = TimeSpan.FromMilliseconds(50); + o.CancellationToken = ct; + }); + + // Assert + Assert.False(result.Succeeded); + Assert.IsType(result.Failure); + } + + [Fact] + public async Task RunUntilSucceededOrTimeoutAsync_ShouldReturnUnsuccessfulWithAggregateException() + { + // Arrange + var exceptions = new List + { + new InvalidOperationException("fail1"), + new ArgumentException("fail2") + }; + var callCount = 0; + Task Method() + { + throw exceptions[callCount++]; + } + + // Act + var result = await Awaiter.RunUntilSucceededOrTimeoutAsync(Method, o => + { + o.Timeout = TimeSpan.FromMilliseconds(50); + o.Delay = TimeSpan.FromMilliseconds(10); + }); + + // Assert + Assert.False(result.Succeeded); + Assert.IsType(result.Failure); + var agg = (AggregateException)result.Failure; + Assert.Contains(exceptions[0], agg.InnerExceptions); + Assert.Contains(exceptions[1], agg.InnerExceptions); + } + } +} From e900c82c601e8a1291c74af119985d0540ee70df Mon Sep 17 00:00:00 2001 From: Michael Mortensen Date: Fri, 13 Jun 2025 23:09:33 +0200 Subject: [PATCH 03/17] rename --- src/Cuemon.Core/Threading/Awaiter.cs | 2 +- .../Threading/AwaiterTest.cs | 20 +++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/Cuemon.Core/Threading/Awaiter.cs b/src/Cuemon.Core/Threading/Awaiter.cs index cee7f726a..7368f028c 100644 --- a/src/Cuemon.Core/Threading/Awaiter.cs +++ b/src/Cuemon.Core/Threading/Awaiter.cs @@ -26,7 +26,7 @@ public static class Awaiter /// 2: One caught exception; initialized with caught exception,
/// 3: Two or more exceptions; initialized with containing all exceptions. /// - public static async Task RunUntilSucceededOrTimeoutAsync(Func> method, Action setup = null) + public static async Task RunUntilSuccessfulOrTimeoutAsync(Func> method, Action setup = null) { var options = Patterns.Configure(setup); var stopwatch = Stopwatch.StartNew(); diff --git a/test/Cuemon.Core.Tests/Threading/AwaiterTest.cs b/test/Cuemon.Core.Tests/Threading/AwaiterTest.cs index c081dccef..e01c8b232 100644 --- a/test/Cuemon.Core.Tests/Threading/AwaiterTest.cs +++ b/test/Cuemon.Core.Tests/Threading/AwaiterTest.cs @@ -10,7 +10,7 @@ namespace Cuemon.Threading public class AwaiterTest : Test { [Fact] - public async Task RunUntilSucceededOrTimeoutAsync_ShouldReturnOnImmediateSuccess() + public async Task RunUntilSuccessfulOrTimeoutAsync_ShouldReturnOnImmediateSuccess() { // Arrange var callCount = 0; @@ -21,7 +21,7 @@ Task Method() } // Act - var result = await Awaiter.RunUntilSucceededOrTimeoutAsync(Method); + var result = await Awaiter.RunUntilSuccessfulOrTimeoutAsync(Method); // Assert Assert.True(result.Succeeded); @@ -29,7 +29,7 @@ Task Method() } [Fact] - public async Task RunUntilSucceededOrTimeoutAsync_ShouldRetryUntilSuccess() + public async Task RunUntilSuccessfulOrTimeoutAsync_ShouldRetryUntilSuccess() { // Arrange var callCount = 0; @@ -42,7 +42,7 @@ Task Method() } // Act - var result = await Awaiter.RunUntilSucceededOrTimeoutAsync(Method, o => + var result = await Awaiter.RunUntilSuccessfulOrTimeoutAsync(Method, o => { o.Timeout = TimeSpan.FromSeconds(2); o.Delay = TimeSpan.FromMilliseconds(10); @@ -54,13 +54,13 @@ Task Method() } [Fact] - public async Task RunUntilSucceededOrTimeoutAsync_ShouldReturnUnsuccessfulOnTimeout_NoExceptions() + public async Task RunUntilSuccessfulOrTimeoutAsync_ShouldReturnUnsuccessfulOnTimeout_NoExceptions() { // Arrange Task Method() => Task.FromResult(new UnsuccessfulValue()); // Act - var result = await Awaiter.RunUntilSucceededOrTimeoutAsync(Method, o => + var result = await Awaiter.RunUntilSuccessfulOrTimeoutAsync(Method, o => { o.Timeout = TimeSpan.FromMilliseconds(50); o.Delay = TimeSpan.FromMilliseconds(10); @@ -72,7 +72,7 @@ public async Task RunUntilSucceededOrTimeoutAsync_ShouldReturnUnsuccessfulOnTime } [Fact] - public async Task RunUntilSucceededOrTimeoutAsync_ShouldReturnUnsuccessfulWithSingleException() + public async Task RunUntilSuccessfulOrTimeoutAsync_ShouldReturnUnsuccessfulWithSingleException() { // Arrange var ct = new CancellationTokenSource(TimeSpan.FromMilliseconds(25)).Token; @@ -80,7 +80,7 @@ public async Task RunUntilSucceededOrTimeoutAsync_ShouldReturnUnsuccessfulWithSi ; // Act - var result = await Awaiter.RunUntilSucceededOrTimeoutAsync(() => Task.FromResult(new UnsuccessfulValue()), o => + var result = await Awaiter.RunUntilSuccessfulOrTimeoutAsync(() => Task.FromResult(new UnsuccessfulValue()), o => { o.Timeout = TimeSpan.FromMilliseconds(75); o.Delay = TimeSpan.FromMilliseconds(50); @@ -93,7 +93,7 @@ public async Task RunUntilSucceededOrTimeoutAsync_ShouldReturnUnsuccessfulWithSi } [Fact] - public async Task RunUntilSucceededOrTimeoutAsync_ShouldReturnUnsuccessfulWithAggregateException() + public async Task RunUntilSuccessfulOrTimeoutAsync_ShouldReturnUnsuccessfulWithAggregateException() { // Arrange var exceptions = new List @@ -108,7 +108,7 @@ Task Method() } // Act - var result = await Awaiter.RunUntilSucceededOrTimeoutAsync(Method, o => + var result = await Awaiter.RunUntilSuccessfulOrTimeoutAsync(Method, o => { o.Timeout = TimeSpan.FromMilliseconds(50); o.Delay = TimeSpan.FromMilliseconds(10); From 03ee55e669b74e47a5c0192ccf178a0a9f792514 Mon Sep 17 00:00:00 2001 From: Michael Mortensen Date: Sat, 14 Jun 2025 19:21:09 +0200 Subject: [PATCH 04/17] tweked to be consistent --- test/Cuemon.Core.Tests/Threading/AwaiterTest.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/Cuemon.Core.Tests/Threading/AwaiterTest.cs b/test/Cuemon.Core.Tests/Threading/AwaiterTest.cs index e01c8b232..4daa088cf 100644 --- a/test/Cuemon.Core.Tests/Threading/AwaiterTest.cs +++ b/test/Cuemon.Core.Tests/Threading/AwaiterTest.cs @@ -75,15 +75,15 @@ public async Task RunUntilSuccessfulOrTimeoutAsync_ShouldReturnUnsuccessfulOnTim public async Task RunUntilSuccessfulOrTimeoutAsync_ShouldReturnUnsuccessfulWithSingleException() { // Arrange - var ct = new CancellationTokenSource(TimeSpan.FromMilliseconds(25)).Token; + var ct = new CancellationTokenSource(TimeSpan.FromMilliseconds(0)).Token; ; // Act var result = await Awaiter.RunUntilSuccessfulOrTimeoutAsync(() => Task.FromResult(new UnsuccessfulValue()), o => { - o.Timeout = TimeSpan.FromMilliseconds(75); - o.Delay = TimeSpan.FromMilliseconds(50); + o.Timeout = TimeSpan.FromMilliseconds(10); + o.Delay = TimeSpan.FromMilliseconds(100); o.CancellationToken = ct; }); From 949f6f066de530dc5569153ba30644b7f4dc1b8d Mon Sep 17 00:00:00 2001 From: Michael Mortensen Date: Sat, 14 Jun 2025 19:41:56 +0200 Subject: [PATCH 05/17] :package: updated NuGet package definition --- .nuget/Cuemon.AspNetCore.App/PackageReleaseNotes.txt | 8 +++++++- .../PackageReleaseNotes.txt | 8 +++++++- .nuget/Cuemon.AspNetCore.Mvc/PackageReleaseNotes.txt | 8 +++++++- .../PackageReleaseNotes.txt | 8 +++++++- .nuget/Cuemon.AspNetCore/PackageReleaseNotes.txt | 8 +++++++- .nuget/Cuemon.Core.App/PackageReleaseNotes.txt | 8 +++++++- .nuget/Cuemon.Core/PackageReleaseNotes.txt | 11 ++++++++++- .nuget/Cuemon.Data.Integrity/PackageReleaseNotes.txt | 8 +++++++- .nuget/Cuemon.Data.SqlClient/PackageReleaseNotes.txt | 8 +++++++- .nuget/Cuemon.Data/PackageReleaseNotes.txt | 8 +++++++- .nuget/Cuemon.Diagnostics/PackageReleaseNotes.txt | 8 +++++++- .../PackageReleaseNotes.txt | 8 +++++++- .../PackageReleaseNotes.txt | 8 +++++++- .../PackageReleaseNotes.txt | 8 +++++++- .../PackageReleaseNotes.txt | 8 +++++++- .../PackageReleaseNotes.txt | 8 +++++++- .../PackageReleaseNotes.txt | 8 +++++++- .../PackageReleaseNotes.txt | 8 +++++++- .../PackageReleaseNotes.txt | 8 +++++++- .../PackageReleaseNotes.txt | 8 +++++++- .../PackageReleaseNotes.txt | 8 +++++++- .nuget/Cuemon.Extensions.Core/PackageReleaseNotes.txt | 8 +++++++- .../PackageReleaseNotes.txt | 8 +++++++- .nuget/Cuemon.Extensions.Data/PackageReleaseNotes.txt | 8 +++++++- .../PackageReleaseNotes.txt | 8 +++++++- .../PackageReleaseNotes.txt | 8 +++++++- .../Cuemon.Extensions.Hosting/PackageReleaseNotes.txt | 8 +++++++- .nuget/Cuemon.Extensions.IO/PackageReleaseNotes.txt | 8 +++++++- .nuget/Cuemon.Extensions.Net/PackageReleaseNotes.txt | 8 +++++++- .../PackageReleaseNotes.txt | 8 +++++++- .../PackageReleaseNotes.txt | 8 +++++++- .../PackageReleaseNotes.txt | 8 +++++++- .nuget/Cuemon.Extensions.Text/PackageReleaseNotes.txt | 8 +++++++- .../PackageReleaseNotes.txt | 8 +++++++- .nuget/Cuemon.Extensions.Xml/PackageReleaseNotes.txt | 8 +++++++- .nuget/Cuemon.IO/PackageReleaseNotes.txt | 8 +++++++- .nuget/Cuemon.Net/PackageReleaseNotes.txt | 8 +++++++- .nuget/Cuemon.Resilience/PackageReleaseNotes.txt | 8 +++++++- .nuget/Cuemon.Runtime.Caching/PackageReleaseNotes.txt | 8 +++++++- .../PackageReleaseNotes.txt | 8 +++++++- .nuget/Cuemon.Threading/PackageReleaseNotes.txt | 8 +++++++- .nuget/Cuemon.Xml/PackageReleaseNotes.txt | 8 +++++++- 42 files changed, 297 insertions(+), 42 deletions(-) diff --git a/.nuget/Cuemon.AspNetCore.App/PackageReleaseNotes.txt b/.nuget/Cuemon.AspNetCore.App/PackageReleaseNotes.txt index bca3580be..e1ad2362e 100644 --- a/.nuget/Cuemon.AspNetCore.App/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.AspNetCore.App/PackageReleaseNotes.txt @@ -1,4 +1,10 @@ -Version 9.0.5 +Version 9.0.6 +Availability: .NET 9 and .NET 8 +  +# ALM +- CHANGED Dependencies to latest and greatest with respect to TFMs +  +Version 9.0.5 Availability: .NET 9 and .NET 8   # ALM diff --git a/.nuget/Cuemon.AspNetCore.Authentication/PackageReleaseNotes.txt b/.nuget/Cuemon.AspNetCore.Authentication/PackageReleaseNotes.txt index 6b5dfa307..eaada0588 100644 --- a/.nuget/Cuemon.AspNetCore.Authentication/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.AspNetCore.Authentication/PackageReleaseNotes.txt @@ -1,4 +1,10 @@ -Version 9.0.5 +Version 9.0.6 +Availability: .NET 9 and .NET 8 +  +# ALM +- CHANGED Dependencies to latest and greatest with respect to TFMs +  +Version 9.0.5 Availability: .NET 9 and .NET 8   # ALM diff --git a/.nuget/Cuemon.AspNetCore.Mvc/PackageReleaseNotes.txt b/.nuget/Cuemon.AspNetCore.Mvc/PackageReleaseNotes.txt index f43e51703..c35dfba83 100644 --- a/.nuget/Cuemon.AspNetCore.Mvc/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.AspNetCore.Mvc/PackageReleaseNotes.txt @@ -1,4 +1,10 @@ -Version 9.0.5 +Version 9.0.6 +Availability: .NET 9 and .NET 8 +  +# ALM +- CHANGED Dependencies to latest and greatest with respect to TFMs +  +Version 9.0.5 Availability: .NET 9 and .NET 8   # ALM diff --git a/.nuget/Cuemon.AspNetCore.Razor.TagHelpers/PackageReleaseNotes.txt b/.nuget/Cuemon.AspNetCore.Razor.TagHelpers/PackageReleaseNotes.txt index 6c35f2879..a6ad8212b 100644 --- a/.nuget/Cuemon.AspNetCore.Razor.TagHelpers/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.AspNetCore.Razor.TagHelpers/PackageReleaseNotes.txt @@ -1,4 +1,10 @@ -Version 9.0.5 +Version 9.0.6 +Availability: .NET 9 and .NET 8 +  +# ALM +- CHANGED Dependencies to latest and greatest with respect to TFMs +  +Version 9.0.5 Availability: .NET 9 and .NET 8   # ALM diff --git a/.nuget/Cuemon.AspNetCore/PackageReleaseNotes.txt b/.nuget/Cuemon.AspNetCore/PackageReleaseNotes.txt index ef3e6454e..20e66248c 100644 --- a/.nuget/Cuemon.AspNetCore/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.AspNetCore/PackageReleaseNotes.txt @@ -1,4 +1,10 @@ -Version 9.0.5 +Version 9.0.6 +Availability: .NET 9 and .NET 8 +  +# ALM +- CHANGED Dependencies to latest and greatest with respect to TFMs +  +Version 9.0.5 Availability: .NET 9 and .NET 8   # ALM diff --git a/.nuget/Cuemon.Core.App/PackageReleaseNotes.txt b/.nuget/Cuemon.Core.App/PackageReleaseNotes.txt index 1f4e1a283..88fb051e3 100644 --- a/.nuget/Cuemon.Core.App/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Core.App/PackageReleaseNotes.txt @@ -1,4 +1,10 @@ -Version 9.0.5 +Version 9.0.6 +Availability: .NET 9, .NET 8 and .NET Standard 2.0 +  +# ALM +- CHANGED Dependencies to latest and greatest with respect to TFMs +  +Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0   # ALM diff --git a/.nuget/Cuemon.Core/PackageReleaseNotes.txt b/.nuget/Cuemon.Core/PackageReleaseNotes.txt index eac5051f8..20409615e 100644 --- a/.nuget/Cuemon.Core/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Core/PackageReleaseNotes.txt @@ -1,4 +1,13 @@ -Version 9.0.5 +Version 9.0.6 +Availability: .NET 9, .NET 8 and .NET Standard 2.0 +  +# ALM +- CHANGED Dependencies to latest and greatest with respect to TFMs +  +# New Features +- ADDED Awaiter class in the Cuemon.Threading namespace that provides a set of static methods for awaiting asynchronous operations +  +Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0   # ALM diff --git a/.nuget/Cuemon.Data.Integrity/PackageReleaseNotes.txt b/.nuget/Cuemon.Data.Integrity/PackageReleaseNotes.txt index dd25ab356..6a42ca862 100644 --- a/.nuget/Cuemon.Data.Integrity/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Data.Integrity/PackageReleaseNotes.txt @@ -1,4 +1,10 @@ -Version 9.0.5 +Version 9.0.6 +Availability: .NET 9, .NET 8 and .NET Standard 2.0 +  +# ALM +- CHANGED Dependencies to latest and greatest with respect to TFMs +  +Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0   # ALM diff --git a/.nuget/Cuemon.Data.SqlClient/PackageReleaseNotes.txt b/.nuget/Cuemon.Data.SqlClient/PackageReleaseNotes.txt index 9983a86c3..c633694ba 100644 --- a/.nuget/Cuemon.Data.SqlClient/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Data.SqlClient/PackageReleaseNotes.txt @@ -1,4 +1,10 @@ -Version 9.0.5 +Version 9.0.6 +Availability: .NET 9, .NET 8 and .NET Standard 2.0 +  +# ALM +- CHANGED Dependencies to latest and greatest with respect to TFMs +  +Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0   # ALM diff --git a/.nuget/Cuemon.Data/PackageReleaseNotes.txt b/.nuget/Cuemon.Data/PackageReleaseNotes.txt index 7bc66ecb0..bd121f8d8 100644 --- a/.nuget/Cuemon.Data/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Data/PackageReleaseNotes.txt @@ -1,4 +1,10 @@ -Version 9.0.5 +Version 9.0.6 +Availability: .NET 9, .NET 8 and .NET Standard 2.0 +  +# ALM +- CHANGED Dependencies to latest and greatest with respect to TFMs +  +Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0   # ALM diff --git a/.nuget/Cuemon.Diagnostics/PackageReleaseNotes.txt b/.nuget/Cuemon.Diagnostics/PackageReleaseNotes.txt index fd9a488f2..a7febfb58 100644 --- a/.nuget/Cuemon.Diagnostics/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Diagnostics/PackageReleaseNotes.txt @@ -1,4 +1,10 @@ -Version 9.0.5 +Version 9.0.6 +Availability: .NET 9, .NET 8 and .NET Standard 2.0 +  +# ALM +- CHANGED Dependencies to latest and greatest with respect to TFMs +  +Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0   # ALM diff --git a/.nuget/Cuemon.Extensions.AspNetCore.Authentication/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.AspNetCore.Authentication/PackageReleaseNotes.txt index 655d71e5a..6f5fa2d55 100644 --- a/.nuget/Cuemon.Extensions.AspNetCore.Authentication/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Extensions.AspNetCore.Authentication/PackageReleaseNotes.txt @@ -1,4 +1,10 @@ -Version 9.0.5 +Version 9.0.6 +Availability: .NET 9 and .NET 8 +  +# ALM +- CHANGED Dependencies to latest and greatest with respect to TFMs +  +Version 9.0.5 Availability: .NET 9 and .NET 8   # ALM diff --git a/.nuget/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Text.Json/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Text.Json/PackageReleaseNotes.txt index 418011071..e1bfde256 100644 --- a/.nuget/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Text.Json/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Text.Json/PackageReleaseNotes.txt @@ -1,4 +1,10 @@ -Version 9.0.5 +Version 9.0.6 +Availability: .NET 9 and .NET 8 +  +# ALM +- CHANGED Dependencies to latest and greatest with respect to TFMs +  +Version 9.0.5 Availability: .NET 9 and .NET 8   # ALM diff --git a/.nuget/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Xml/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Xml/PackageReleaseNotes.txt index 26ffc711f..8353fe33b 100644 --- a/.nuget/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Xml/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Xml/PackageReleaseNotes.txt @@ -1,4 +1,10 @@ -Version 9.0.5 +Version 9.0.6 +Availability: .NET 9 and .NET 8 +  +# ALM +- CHANGED Dependencies to latest and greatest with respect to TFMs +  +Version 9.0.5 Availability: .NET 9 and .NET 8   # ALM diff --git a/.nuget/Cuemon.Extensions.AspNetCore.Mvc.RazorPages/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.AspNetCore.Mvc.RazorPages/PackageReleaseNotes.txt index d7c2cf1e1..10af5c271 100644 --- a/.nuget/Cuemon.Extensions.AspNetCore.Mvc.RazorPages/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Extensions.AspNetCore.Mvc.RazorPages/PackageReleaseNotes.txt @@ -1,4 +1,10 @@ -Version 9.0.5 +Version 9.0.6 +Availability: .NET 9 and .NET 8 +  +# ALM +- CHANGED Dependencies to latest and greatest with respect to TFMs +  +Version 9.0.5 Availability: .NET 9 and .NET 8   # ALM diff --git a/.nuget/Cuemon.Extensions.AspNetCore.Mvc/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.AspNetCore.Mvc/PackageReleaseNotes.txt index 92572058d..908357d5f 100644 --- a/.nuget/Cuemon.Extensions.AspNetCore.Mvc/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Extensions.AspNetCore.Mvc/PackageReleaseNotes.txt @@ -1,4 +1,10 @@ -Version 9.0.5 +Version 9.0.6 +Availability: .NET 9 and .NET 8 +  +# ALM +- CHANGED Dependencies to latest and greatest with respect to TFMs +  +Version 9.0.5 Availability: .NET 9 and .NET 8   # ALM diff --git a/.nuget/Cuemon.Extensions.AspNetCore.Text.Json/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.AspNetCore.Text.Json/PackageReleaseNotes.txt index a5ec79d63..b373b06b3 100644 --- a/.nuget/Cuemon.Extensions.AspNetCore.Text.Json/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Extensions.AspNetCore.Text.Json/PackageReleaseNotes.txt @@ -1,4 +1,10 @@ -Version 9.0.5 +Version 9.0.6 +Availability: .NET 9 and .NET 8 +  +# ALM +- CHANGED Dependencies to latest and greatest with respect to TFMs +  +Version 9.0.5 Availability: .NET 9 and .NET 8   # ALM diff --git a/.nuget/Cuemon.Extensions.AspNetCore.Xml/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.AspNetCore.Xml/PackageReleaseNotes.txt index 643c8a17d..cea6f06c0 100644 --- a/.nuget/Cuemon.Extensions.AspNetCore.Xml/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Extensions.AspNetCore.Xml/PackageReleaseNotes.txt @@ -1,4 +1,10 @@ -Version 9.0.5 +Version 9.0.6 +Availability: .NET 9 and .NET 8 +  +# ALM +- CHANGED Dependencies to latest and greatest with respect to TFMs +  +Version 9.0.5 Availability: .NET 9 and .NET 8   # ALM diff --git a/.nuget/Cuemon.Extensions.AspNetCore/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.AspNetCore/PackageReleaseNotes.txt index 05d8d31c8..f3f5ca1dd 100644 --- a/.nuget/Cuemon.Extensions.AspNetCore/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Extensions.AspNetCore/PackageReleaseNotes.txt @@ -1,4 +1,10 @@ -Version 9.0.5 +Version 9.0.6 +Availability: .NET 9 and .NET 8 +  +# ALM +- CHANGED Dependencies to latest and greatest with respect to TFMs +  +Version 9.0.5 Availability: .NET 9 and .NET 8   # ALM diff --git a/.nuget/Cuemon.Extensions.Collections.Generic/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.Collections.Generic/PackageReleaseNotes.txt index dd25ab356..6a42ca862 100644 --- a/.nuget/Cuemon.Extensions.Collections.Generic/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Extensions.Collections.Generic/PackageReleaseNotes.txt @@ -1,4 +1,10 @@ -Version 9.0.5 +Version 9.0.6 +Availability: .NET 9, .NET 8 and .NET Standard 2.0 +  +# ALM +- CHANGED Dependencies to latest and greatest with respect to TFMs +  +Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0   # ALM diff --git a/.nuget/Cuemon.Extensions.Collections.Specialized/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.Collections.Specialized/PackageReleaseNotes.txt index dd25ab356..6a42ca862 100644 --- a/.nuget/Cuemon.Extensions.Collections.Specialized/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Extensions.Collections.Specialized/PackageReleaseNotes.txt @@ -1,4 +1,10 @@ -Version 9.0.5 +Version 9.0.6 +Availability: .NET 9, .NET 8 and .NET Standard 2.0 +  +# ALM +- CHANGED Dependencies to latest and greatest with respect to TFMs +  +Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0   # ALM diff --git a/.nuget/Cuemon.Extensions.Core/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.Core/PackageReleaseNotes.txt index 42c21b255..5961b6ee4 100644 --- a/.nuget/Cuemon.Extensions.Core/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Extensions.Core/PackageReleaseNotes.txt @@ -1,4 +1,10 @@ -Version 9.0.5 +Version 9.0.6 +Availability: .NET 9, .NET 8 and .NET Standard 2.0 +  +# ALM +- CHANGED Dependencies to latest and greatest with respect to TFMs +  +Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0   # ALM diff --git a/.nuget/Cuemon.Extensions.Data.Integrity/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.Data.Integrity/PackageReleaseNotes.txt index dd25ab356..6a42ca862 100644 --- a/.nuget/Cuemon.Extensions.Data.Integrity/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Extensions.Data.Integrity/PackageReleaseNotes.txt @@ -1,4 +1,10 @@ -Version 9.0.5 +Version 9.0.6 +Availability: .NET 9, .NET 8 and .NET Standard 2.0 +  +# ALM +- CHANGED Dependencies to latest and greatest with respect to TFMs +  +Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0   # ALM diff --git a/.nuget/Cuemon.Extensions.Data/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.Data/PackageReleaseNotes.txt index 514daa01e..55a5f4a0c 100644 --- a/.nuget/Cuemon.Extensions.Data/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Extensions.Data/PackageReleaseNotes.txt @@ -1,4 +1,10 @@ -Version 9.0.5 +Version 9.0.6 +Availability: .NET 9, .NET 8 and .NET Standard 2.0 +  +# ALM +- CHANGED Dependencies to latest and greatest with respect to TFMs +  +Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0   # ALM diff --git a/.nuget/Cuemon.Extensions.DependencyInjection/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.DependencyInjection/PackageReleaseNotes.txt index 9aefcd2fe..7d0abf069 100644 --- a/.nuget/Cuemon.Extensions.DependencyInjection/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Extensions.DependencyInjection/PackageReleaseNotes.txt @@ -1,4 +1,10 @@ -Version 9.0.5 +Version 9.0.6 +Availability: .NET 9, .NET 8 and .NET Standard 2.0 +  +# ALM +- CHANGED Dependencies to latest and greatest with respect to TFMs +  +Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0   # ALM diff --git a/.nuget/Cuemon.Extensions.Diagnostics/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.Diagnostics/PackageReleaseNotes.txt index 81ae84502..1d69c3ee2 100644 --- a/.nuget/Cuemon.Extensions.Diagnostics/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Extensions.Diagnostics/PackageReleaseNotes.txt @@ -1,4 +1,10 @@ -Version 9.0.5 +Version 9.0.6 +Availability: .NET 9, .NET 8 and .NET Standard 2.0 +  +# ALM +- CHANGED Dependencies to latest and greatest with respect to TFMs +  +Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0   # ALM diff --git a/.nuget/Cuemon.Extensions.Hosting/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.Hosting/PackageReleaseNotes.txt index 1030884cf..67ea82999 100644 --- a/.nuget/Cuemon.Extensions.Hosting/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Extensions.Hosting/PackageReleaseNotes.txt @@ -1,4 +1,10 @@ -Version 9.0.5 +Version 9.0.6 +Availability: .NET 9, .NET 8 and .NET Standard 2.0 +  +# ALM +- CHANGED Dependencies to latest and greatest with respect to TFMs +  +Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0   # ALM diff --git a/.nuget/Cuemon.Extensions.IO/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.IO/PackageReleaseNotes.txt index 02c4b26a4..9ccd2c54e 100644 --- a/.nuget/Cuemon.Extensions.IO/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Extensions.IO/PackageReleaseNotes.txt @@ -1,4 +1,10 @@ -Version 9.0.5 +Version 9.0.6 +Availability: .NET 9, .NET 8, .NET Standard 2.1 and .NET Standard 2.0 +  +# ALM +- CHANGED Dependencies to latest and greatest with respect to TFMs +  +Version 9.0.5 Availability: .NET 9, .NET 8, .NET Standard 2.1 and .NET Standard 2.0   # ALM diff --git a/.nuget/Cuemon.Extensions.Net/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.Net/PackageReleaseNotes.txt index 27fdc8ba1..7a5343f75 100644 --- a/.nuget/Cuemon.Extensions.Net/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Extensions.Net/PackageReleaseNotes.txt @@ -1,4 +1,10 @@ -Version 9.0.5 +Version 9.0.6 +Availability: .NET 9, .NET 8 and .NET Standard 2.0 +  +# ALM +- CHANGED Dependencies to latest and greatest with respect to TFMs +  +Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0   # ALM diff --git a/.nuget/Cuemon.Extensions.Reflection/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.Reflection/PackageReleaseNotes.txt index dd25ab356..6a42ca862 100644 --- a/.nuget/Cuemon.Extensions.Reflection/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Extensions.Reflection/PackageReleaseNotes.txt @@ -1,4 +1,10 @@ -Version 9.0.5 +Version 9.0.6 +Availability: .NET 9, .NET 8 and .NET Standard 2.0 +  +# ALM +- CHANGED Dependencies to latest and greatest with respect to TFMs +  +Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0   # ALM diff --git a/.nuget/Cuemon.Extensions.Runtime.Caching/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.Runtime.Caching/PackageReleaseNotes.txt index dd25ab356..6a42ca862 100644 --- a/.nuget/Cuemon.Extensions.Runtime.Caching/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Extensions.Runtime.Caching/PackageReleaseNotes.txt @@ -1,4 +1,10 @@ -Version 9.0.5 +Version 9.0.6 +Availability: .NET 9, .NET 8 and .NET Standard 2.0 +  +# ALM +- CHANGED Dependencies to latest and greatest with respect to TFMs +  +Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0   # ALM diff --git a/.nuget/Cuemon.Extensions.Text.Json/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.Text.Json/PackageReleaseNotes.txt index 0df8bdde7..8548a95fb 100644 --- a/.nuget/Cuemon.Extensions.Text.Json/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Extensions.Text.Json/PackageReleaseNotes.txt @@ -1,4 +1,10 @@ -Version 9.0.5 +Version 9.0.6 +Availability: .NET 9, .NET 8 and .NET Standard 2.0 +  +# ALM +- CHANGED Dependencies to latest and greatest with respect to TFMs +  +Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0   # ALM diff --git a/.nuget/Cuemon.Extensions.Text/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.Text/PackageReleaseNotes.txt index dd25ab356..6a42ca862 100644 --- a/.nuget/Cuemon.Extensions.Text/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Extensions.Text/PackageReleaseNotes.txt @@ -1,4 +1,10 @@ -Version 9.0.5 +Version 9.0.6 +Availability: .NET 9, .NET 8 and .NET Standard 2.0 +  +# ALM +- CHANGED Dependencies to latest and greatest with respect to TFMs +  +Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0   # ALM diff --git a/.nuget/Cuemon.Extensions.Threading/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.Threading/PackageReleaseNotes.txt index 6ea8ae352..93b7cc5fc 100644 --- a/.nuget/Cuemon.Extensions.Threading/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Extensions.Threading/PackageReleaseNotes.txt @@ -1,4 +1,10 @@ -Version 9.0.5 +Version 9.0.6 +Availability: .NET 9, .NET 8 and .NET Standard 2.0 +  +# ALM +- CHANGED Dependencies to latest and greatest with respect to TFMs +  +Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0   # ALM diff --git a/.nuget/Cuemon.Extensions.Xml/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.Xml/PackageReleaseNotes.txt index 65e4632e6..bcd1d6412 100644 --- a/.nuget/Cuemon.Extensions.Xml/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Extensions.Xml/PackageReleaseNotes.txt @@ -1,4 +1,10 @@ -Version 9.0.5 +Version 9.0.6 +Availability: .NET 9, .NET 8 and .NET Standard 2.0 +  +# ALM +- CHANGED Dependencies to latest and greatest with respect to TFMs +  +Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0   # ALM diff --git a/.nuget/Cuemon.IO/PackageReleaseNotes.txt b/.nuget/Cuemon.IO/PackageReleaseNotes.txt index 02c4b26a4..9ccd2c54e 100644 --- a/.nuget/Cuemon.IO/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.IO/PackageReleaseNotes.txt @@ -1,4 +1,10 @@ -Version 9.0.5 +Version 9.0.6 +Availability: .NET 9, .NET 8, .NET Standard 2.1 and .NET Standard 2.0 +  +# ALM +- CHANGED Dependencies to latest and greatest with respect to TFMs +  +Version 9.0.5 Availability: .NET 9, .NET 8, .NET Standard 2.1 and .NET Standard 2.0   # ALM diff --git a/.nuget/Cuemon.Net/PackageReleaseNotes.txt b/.nuget/Cuemon.Net/PackageReleaseNotes.txt index dd25ab356..6a42ca862 100644 --- a/.nuget/Cuemon.Net/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Net/PackageReleaseNotes.txt @@ -1,4 +1,10 @@ -Version 9.0.5 +Version 9.0.6 +Availability: .NET 9, .NET 8 and .NET Standard 2.0 +  +# ALM +- CHANGED Dependencies to latest and greatest with respect to TFMs +  +Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0   # ALM diff --git a/.nuget/Cuemon.Resilience/PackageReleaseNotes.txt b/.nuget/Cuemon.Resilience/PackageReleaseNotes.txt index ce2b303a1..b497907e9 100644 --- a/.nuget/Cuemon.Resilience/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Resilience/PackageReleaseNotes.txt @@ -1,4 +1,10 @@ -Version 9.0.5 +Version 9.0.6 +Availability: .NET 9, .NET 8 and .NET Standard 2.0 +  +# ALM +- CHANGED Dependencies to latest and greatest with respect to TFMs +  +Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0   # ALM diff --git a/.nuget/Cuemon.Runtime.Caching/PackageReleaseNotes.txt b/.nuget/Cuemon.Runtime.Caching/PackageReleaseNotes.txt index eb3187623..9d4048d14 100644 --- a/.nuget/Cuemon.Runtime.Caching/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Runtime.Caching/PackageReleaseNotes.txt @@ -1,4 +1,10 @@ -Version 9.0.5 +Version 9.0.6 +Availability: .NET 9, .NET 8 and .NET Standard 2.0 +  +# ALM +- CHANGED Dependencies to latest and greatest with respect to TFMs +  +Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0   # ALM diff --git a/.nuget/Cuemon.Security.Cryptography/PackageReleaseNotes.txt b/.nuget/Cuemon.Security.Cryptography/PackageReleaseNotes.txt index 8759e7d71..350467c40 100644 --- a/.nuget/Cuemon.Security.Cryptography/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Security.Cryptography/PackageReleaseNotes.txt @@ -1,4 +1,10 @@ -Version 9.0.5 +Version 9.0.6 +Availability: .NET 9, .NET 8 and .NET Standard 2.0 +  +# ALM +- CHANGED Dependencies to latest and greatest with respect to TFMs +  +Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0   # ALM diff --git a/.nuget/Cuemon.Threading/PackageReleaseNotes.txt b/.nuget/Cuemon.Threading/PackageReleaseNotes.txt index e95e75419..2c1a959f0 100644 --- a/.nuget/Cuemon.Threading/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Threading/PackageReleaseNotes.txt @@ -1,4 +1,10 @@ -Version 9.0.5 +Version 9.0.6 +Availability: .NET 9, .NET 8 and .NET Standard 2.0 +  +# ALM +- CHANGED Dependencies to latest and greatest with respect to TFMs +  +Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0   # ALM diff --git a/.nuget/Cuemon.Xml/PackageReleaseNotes.txt b/.nuget/Cuemon.Xml/PackageReleaseNotes.txt index bde763f0a..1d0e66017 100644 --- a/.nuget/Cuemon.Xml/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Xml/PackageReleaseNotes.txt @@ -1,4 +1,10 @@ -Version 9.0.5 +Version 9.0.6 +Availability: .NET 9, .NET 8 and .NET Standard 2.0 +  +# ALM +- CHANGED Dependencies to latest and greatest with respect to TFMs +  +Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0   # ALM From 3a45da8c33b298a1ff20c1eaeff222974d3ea124 Mon Sep 17 00:00:00 2001 From: Michael Mortensen Date: Sat, 14 Jun 2025 19:42:02 +0200 Subject: [PATCH 06/17] :speech_balloon: updated community health pages --- CHANGELOG.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a038293f6..093699617 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,16 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), For more details, please refer to `PackageReleaseNotes.txt` on a per assembly basis in the `.nuget` folder. +## [9.0.6] - 2025-06-14 + +This is a service update that focuses on package dependencies and a minor new handy feature; `Cuemon.Threading.Awaiter.RunUntilSuccessfulOrTimeoutAsync` method. + +### Added + +- Awaiter class in the Cuemon.Threading namespace that provides a set of static methods for awaiting asynchronous operations: + - RunUntilSuccessfulOrTimeoutAsync repeatedly invokes a specified asynchronous lambda expression until it succeeds or a configured timeout is reached + + ## [9.0.5] - 2025-05-13 This is a service update that focuses on package dependencies and a few bug fixes. From 1464b91cd4596b5a99d90745bce1ebc5272a9fba Mon Sep 17 00:00:00 2001 From: Michael Mortensen Date: Sat, 14 Jun 2025 20:43:46 +0200 Subject: [PATCH 07/17] fix for .net48 --- src/Cuemon.Core/Threading/Awaiter.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Cuemon.Core/Threading/Awaiter.cs b/src/Cuemon.Core/Threading/Awaiter.cs index 7368f028c..eff57fd6a 100644 --- a/src/Cuemon.Core/Threading/Awaiter.cs +++ b/src/Cuemon.Core/Threading/Awaiter.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Diagnostics; +using System.Linq; using System.Threading.Tasks; namespace Cuemon.Threading @@ -57,7 +58,7 @@ public static async Task RunUntilSuccessfulOrTimeoutAsync(Func private static ConditionalValue GetUnsuccessfulValue(IList exceptions) { if (exceptions.Count == 0) { return new UnsuccessfulValue(); } - if (exceptions.Count == 1) { return new UnsuccessfulValue(exceptions[0]); } + if (exceptions.Count == 1) { return new UnsuccessfulValue(exceptions.Single()); } return new UnsuccessfulValue(new AggregateException(exceptions)); } } From 3741b925a149126e0526674eec5702c588da1a07 Mon Sep 17 00:00:00 2001 From: Michael Mortensen Date: Sat, 14 Jun 2025 21:11:51 +0200 Subject: [PATCH 08/17] fix --- src/Cuemon.Core/Threading/Awaiter.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Cuemon.Core/Threading/Awaiter.cs b/src/Cuemon.Core/Threading/Awaiter.cs index eff57fd6a..63a27855e 100644 --- a/src/Cuemon.Core/Threading/Awaiter.cs +++ b/src/Cuemon.Core/Threading/Awaiter.cs @@ -52,14 +52,14 @@ public static async Task RunUntilSuccessfulOrTimeoutAsync(Func return (conditionalValue?.Succeeded ?? false) ? conditionalValue - : GetUnsuccessfulValue(exceptions); + : await GetUnsuccessfulValue(exceptions).ConfigureAwait(false); } - private static ConditionalValue GetUnsuccessfulValue(IList exceptions) + private static Task GetUnsuccessfulValue(IList exceptions) { - if (exceptions.Count == 0) { return new UnsuccessfulValue(); } - if (exceptions.Count == 1) { return new UnsuccessfulValue(exceptions.Single()); } - return new UnsuccessfulValue(new AggregateException(exceptions)); + if (exceptions.Count == 0) { return Task.FromResult(new UnsuccessfulValue()); } + if (exceptions.Count == 1) { return Task.FromResult(new UnsuccessfulValue(exceptions.Single())); } + return Task.FromResult(new UnsuccessfulValue(new AggregateException(exceptions))); } } } From 4773b02abe15d3e623ab4d373aaf1aac07786f9b Mon Sep 17 00:00:00 2001 From: Michael Mortensen Date: Sat, 14 Jun 2025 21:58:54 +0200 Subject: [PATCH 09/17] fix for net48 test --- .github/workflows/pipelines.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/pipelines.yml b/.github/workflows/pipelines.yml index 2ab791ae6..1e6169131 100644 --- a/.github/workflows/pipelines.yml +++ b/.github/workflows/pipelines.yml @@ -99,6 +99,7 @@ jobs: projects: ${{ matrix.project }} restore-cache-key: ${{ matrix.os == 'ubuntu-24.04' && needs.prepare_linux.outputs.restore-cache-key || needs.prepare_windows.outputs.restore-cache-key }} test-arguments: -- RunConfiguration.DisableAppDomain=true + build: true # we need to build for .net48 integration_test: name: ⚗️ Integration Test From ca3f14f9ddbe0b3827159190b176b80974f3b645 Mon Sep 17 00:00:00 2001 From: Michael Mortensen Date: Sat, 14 Jun 2025 22:14:58 +0200 Subject: [PATCH 10/17] fix --- .github/workflows/pipelines.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/pipelines.yml b/.github/workflows/pipelines.yml index 1e6169131..6796f46d8 100644 --- a/.github/workflows/pipelines.yml +++ b/.github/workflows/pipelines.yml @@ -100,6 +100,7 @@ jobs: restore-cache-key: ${{ matrix.os == 'ubuntu-24.04' && needs.prepare_linux.outputs.restore-cache-key || needs.prepare_windows.outputs.restore-cache-key }} test-arguments: -- RunConfiguration.DisableAppDomain=true build: true # we need to build for .net48 + restore: true # apparently we need to restore for .net48 integration_test: name: ⚗️ Integration Test From 8fd4f30e2a91e5fe31c272fe8e87a5d13e3658f6 Mon Sep 17 00:00:00 2001 From: Michael Mortensen Date: Sat, 14 Jun 2025 22:25:47 +0200 Subject: [PATCH 11/17] segregate windows/linux --- .github/workflows/pipelines.yml | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/.github/workflows/pipelines.yml b/.github/workflows/pipelines.yml index 6796f46d8..a785a58cd 100644 --- a/.github/workflows/pipelines.yml +++ b/.github/workflows/pipelines.yml @@ -83,21 +83,35 @@ jobs: version: ${{ needs.build.outputs.version }} restore-cache-key: ${{ needs.prepare_linux.outputs.restore-cache-key }} - test: + test_linux: name: call-test - needs: [build, prepare_test, prepare_linux, prepare_windows] + needs: [build, prepare_test, prepare_linux] strategy: fail-fast: false matrix: - os: [ubuntu-24.04, windows-2022] configuration: [Debug, Release] project: ${{ fromJson(needs.prepare_test.outputs.json) }} uses: codebeltnet/jobs-dotnet-test/.github/workflows/default.yml@v2 with: - runs-on: ${{ matrix.os }} + runs-on: ubuntu-24.04 configuration: ${{ matrix.configuration }} projects: ${{ matrix.project }} - restore-cache-key: ${{ matrix.os == 'ubuntu-24.04' && needs.prepare_linux.outputs.restore-cache-key || needs.prepare_windows.outputs.restore-cache-key }} + restore-cache-key: needs.prepare_linux.outputs.restore-cache-key + + test_windows: + name: call-test + needs: [build, prepare_test, prepare_windows] + strategy: + fail-fast: false + matrix: + configuration: [Debug, Release] + project: ${{ fromJson(needs.prepare_test.outputs.json) }} + uses: codebeltnet/jobs-dotnet-test/.github/workflows/default.yml@v2 + with: + runs-on: windows-2022 + configuration: ${{ matrix.configuration }} + projects: ${{ matrix.project }} + restore-cache-key: needs.prepare_windows.outputs.restore-cache-key test-arguments: -- RunConfiguration.DisableAppDomain=true build: true # we need to build for .net48 restore: true # apparently we need to restore for .net48 From 019a78d914bccbbca5dbe63518243e6a11c3addf Mon Sep 17 00:00:00 2001 From: Michael Mortensen Date: Sat, 14 Jun 2025 22:26:06 +0200 Subject: [PATCH 12/17] fix --- .github/workflows/pipelines.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/pipelines.yml b/.github/workflows/pipelines.yml index a785a58cd..07c6b4138 100644 --- a/.github/workflows/pipelines.yml +++ b/.github/workflows/pipelines.yml @@ -111,7 +111,6 @@ jobs: runs-on: windows-2022 configuration: ${{ matrix.configuration }} projects: ${{ matrix.project }} - restore-cache-key: needs.prepare_windows.outputs.restore-cache-key test-arguments: -- RunConfiguration.DisableAppDomain=true build: true # we need to build for .net48 restore: true # apparently we need to restore for .net48 From 80197c98341086537b1a81e7ec0d843e97af407a Mon Sep 17 00:00:00 2001 From: Michael Mortensen Date: Sat, 14 Jun 2025 22:27:36 +0200 Subject: [PATCH 13/17] fix --- .github/workflows/pipelines.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/pipelines.yml b/.github/workflows/pipelines.yml index 07c6b4138..b0ab1c1a0 100644 --- a/.github/workflows/pipelines.yml +++ b/.github/workflows/pipelines.yml @@ -177,7 +177,7 @@ jobs: sonarcloud: name: call-sonarcloud - needs: [build,test,integration_test] + needs: [build, test_linux, test_windows, integration_test] uses: codebeltnet/jobs-sonarcloud/.github/workflows/default.yml@v1 with: organization: geekle @@ -188,7 +188,7 @@ jobs: codecov: name: call-codecov - needs: [build,test,integration_test] + needs: [build, test_linux, test_windows, integration_test] uses: codebeltnet/jobs-codecov/.github/workflows/default.yml@v1 with: repository: gimlichael/Cuemon @@ -197,7 +197,7 @@ jobs: codeql: name: call-codeql - needs: [build,test,integration_test] + needs: [build, test_linux, test_windows, integration_test] uses: codebeltnet/jobs-codeql/.github/workflows/default.yml@v1 permissions: security-events: write @@ -205,7 +205,7 @@ jobs: deploy: if: github.event_name != 'pull_request' name: call-nuget - needs: [build, pack, test, integration_test, sonarcloud, codecov, codeql] + needs: [build, pack, test_linux, test_windows, integration_test, sonarcloud, codecov, codeql] uses: codebeltnet/jobs-nuget-push/.github/workflows/default.yml@v1 with: version: ${{ needs.build.outputs.version }} From b9b32745640434b5295366cfb0173f018a0358b5 Mon Sep 17 00:00:00 2001 From: Michael Mortensen Date: Sat, 14 Jun 2025 22:28:30 +0200 Subject: [PATCH 14/17] fix --- .github/workflows/pipelines.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/pipelines.yml b/.github/workflows/pipelines.yml index b0ab1c1a0..e0da4fe5e 100644 --- a/.github/workflows/pipelines.yml +++ b/.github/workflows/pipelines.yml @@ -28,12 +28,12 @@ jobs: with: use-restore-cache: true - prepare_windows: - name: 🪟 Prepare Windows - uses: codebeltnet/jobs-dotnet-restore/.github/workflows/default.yml@v1 - with: - use-restore-cache: true - runs-on: windows-2022 + # prepare_windows: + # name: 🪟 Prepare Windows + # uses: codebeltnet/jobs-dotnet-restore/.github/workflows/default.yml@v1 + # with: + # use-restore-cache: true + # runs-on: windows-2022 prepare_test: name: 📜 Prepare Test @@ -100,7 +100,7 @@ jobs: test_windows: name: call-test - needs: [build, prepare_test, prepare_windows] + needs: [build, prepare_test] strategy: fail-fast: false matrix: From 19375cffccc723e3163576bc0bc56fd04bfc18a6 Mon Sep 17 00:00:00 2001 From: Michael Mortensen Date: Sun, 15 Jun 2025 01:12:51 +0200 Subject: [PATCH 15/17] tweaked --- test/Cuemon.Core.Tests/Threading/AwaiterTest.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/test/Cuemon.Core.Tests/Threading/AwaiterTest.cs b/test/Cuemon.Core.Tests/Threading/AwaiterTest.cs index 4daa088cf..d88441da1 100644 --- a/test/Cuemon.Core.Tests/Threading/AwaiterTest.cs +++ b/test/Cuemon.Core.Tests/Threading/AwaiterTest.cs @@ -75,9 +75,11 @@ public async Task RunUntilSuccessfulOrTimeoutAsync_ShouldReturnUnsuccessfulOnTim public async Task RunUntilSuccessfulOrTimeoutAsync_ShouldReturnUnsuccessfulWithSingleException() { // Arrange - var ct = new CancellationTokenSource(TimeSpan.FromMilliseconds(0)).Token; + var cts = new CancellationTokenSource(); - ; + cts.Cancel(); + + var ct = cts.Token; // Act var result = await Awaiter.RunUntilSuccessfulOrTimeoutAsync(() => Task.FromResult(new UnsuccessfulValue()), o => From 8ee7a7b8267c2d41467d3223b4be373b704344d7 Mon Sep 17 00:00:00 2001 From: Michael Mortensen Date: Sun, 15 Jun 2025 01:59:00 +0200 Subject: [PATCH 16/17] Update .github/workflows/pipelines.yml Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- .github/workflows/pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pipelines.yml b/.github/workflows/pipelines.yml index e0da4fe5e..8f37efcf3 100644 --- a/.github/workflows/pipelines.yml +++ b/.github/workflows/pipelines.yml @@ -96,7 +96,7 @@ jobs: runs-on: ubuntu-24.04 configuration: ${{ matrix.configuration }} projects: ${{ matrix.project }} - restore-cache-key: needs.prepare_linux.outputs.restore-cache-key + restore-cache-key: ${{ needs.prepare_linux.outputs.restore-cache-key }} test_windows: name: call-test From a2439704ac6e3f0b66c94339f7182947496636d7 Mon Sep 17 00:00:00 2001 From: Michael Mortensen Date: Sun, 15 Jun 2025 02:02:23 +0200 Subject: [PATCH 17/17] fix --- .nuget/Cuemon.Core/PackageReleaseNotes.txt | 1 + CHANGELOG.md | 1 + 2 files changed, 2 insertions(+) diff --git a/.nuget/Cuemon.Core/PackageReleaseNotes.txt b/.nuget/Cuemon.Core/PackageReleaseNotes.txt index 20409615e..b93dc9e80 100644 --- a/.nuget/Cuemon.Core/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Core/PackageReleaseNotes.txt @@ -6,6 +6,7 @@ Availability: .NET 9, .NET 8 and .NET Standard 2.0   # New Features - ADDED Awaiter class in the Cuemon.Threading namespace that provides a set of static methods for awaiting asynchronous operations +- ADDED AsyncRunOptions class in the Cuemon.Threading namespace that provides configuration options for the Awaiter.RunUntilSuccessfulOrTimeoutAsync method   Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0 diff --git a/CHANGELOG.md b/CHANGELOG.md index 093699617..fc1636c5a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ This is a service update that focuses on package dependencies and a minor new ha - Awaiter class in the Cuemon.Threading namespace that provides a set of static methods for awaiting asynchronous operations: - RunUntilSuccessfulOrTimeoutAsync repeatedly invokes a specified asynchronous lambda expression until it succeeds or a configured timeout is reached +- AsyncRunOptions class in the Cuemon.Threading namespace that provides configuration options for the RunUntilSuccessfulOrTimeoutAsync method ## [9.0.5] - 2025-05-13