Skip to content

Commit a2559b1

Browse files
Add support for .NET 8 (#1144)
- Add `net8.0` targets. - Use .NET `TimeProvider` implementation. - Use `FakeTimeProvider` for tests. - Use new .NET 8 APIs where relevant. Co-Authored-By: martintmk <[email protected]>
1 parent 74677bc commit a2559b1

38 files changed

+234
-891
lines changed

Directory.Packages.props

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<Project>
22
<PropertyGroup>
3-
<MicrosoftExtensionsVersion>7.0.0</MicrosoftExtensionsVersion>
3+
<MicrosoftExtensionsVersion>8.0.0</MicrosoftExtensionsVersion>
44
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
55
<PollyVersion>8.1.0</PollyVersion>
66
</PropertyGroup>
@@ -10,6 +10,7 @@
1010
<PackageVersion Include="FluentAssertions" Version="6.12.0" />
1111
<PackageVersion Include="GitHubActionsTestLogger" Version="2.3.3" />
1212
<PackageVersion Include="Microsoft.Bcl.AsyncInterfaces" Version="6.0.0" />
13+
<PackageVersion Include="Microsoft.Bcl.TimeProvider" Version="$(MicrosoftExtensionsVersion)" />
1314
<PackageVersion Include="Microsoft.CodeAnalysis.BannedApiAnalyzers" Version="3.3.4" />
1415
<PackageVersion Include="Microsoft.CodeAnalysis.PublicApiAnalyzers" Version="3.3.4" />
1516
<PackageVersion Include="Microsoft.Extensions.Caching.Memory" Version="$(MicrosoftExtensionsVersion)" />
@@ -20,6 +21,7 @@
2021
<PackageVersion Include="Microsoft.Extensions.Logging.Console" Version="$(MicrosoftExtensionsVersion)" />
2122
<PackageVersion Include="Microsoft.Extensions.Options" Version="$(MicrosoftExtensionsVersion)" />
2223
<PackageVersion Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="$(MicrosoftExtensionsVersion)" />
24+
<PackageVersion Include="Microsoft.Extensions.TimeProvider.Testing" Version="8.0.0" />
2325
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
2426
<PackageVersion Include="Microsoft.SourceLink.GitHub" Version="1.1.1" />
2527
<PackageVersion Include="MinVer" Version="4.3.0" />
@@ -41,12 +43,4 @@
4143
<PackageVersion Include="xunit" Version="2.6.1" />
4244
<PackageVersion Include="xunit.runner.visualstudio" Version="2.5.3" />
4345
</ItemGroup>
44-
<ItemGroup Condition="$(TargetFramework) == 'net6.0'">
45-
<PackageVersion Update="Microsoft.Extensions.Options" Version="6.0.0" />
46-
<PackageVersion Update="Microsoft.Extensions.Logging.Abstractions" Version="6.0.0" />
47-
</ItemGroup>
48-
<ItemGroup Condition="!$([MSBuild]::IsTargetFrameworkCompatible($(TargetFramework), 'netcoreapp3.1'))">
49-
<PackageVersion Update="Microsoft.Extensions.Options" Version="2.2.0" />
50-
<PackageVersion Update="Microsoft.Extensions.Logging.Abstractions" Version="6.0.0" />
51-
</ItemGroup>
5246
</Project>

bench/Polly.Benchmarks/Polly.Benchmarks.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<PropertyGroup>
33
<IsPackable>false</IsPackable>
44
<OutputType>Exe</OutputType>
5-
<TargetFrameworks>net6.0;net7.0</TargetFrameworks>
5+
<TargetFrameworks>net6.0;net7.0;net8.0</TargetFrameworks>
66
<Nullable>enable</Nullable>
77
<ProjectType>Benchmark</ProjectType>
88
<NoWarn>$(NoWarn);CA1822;SA1414;IDE0060</NoWarn>

bench/Polly.Core.Benchmarks/Polly.Core.Benchmarks.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22
<PropertyGroup>
3-
<TargetFrameworks>net7.0</TargetFrameworks>
3+
<TargetFrameworks>net8.0;net7.0</TargetFrameworks>
44
<RootNamespace>Polly</RootNamespace>
55
<ImplicitUsings>true</ImplicitUsings>
66
<ProjectType>Benchmark</ProjectType>

eng/Library.targets

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
<PropertyGroup Label="NuGet package validation">
1616
<EnablePackageValidation Condition="'$(EnablePackageValidation)' == ''">true</EnablePackageValidation>
17+
<!-- TODO Bump to 8.2.0 once published to NuGet.org -->
1718
<PackageValidationBaselineVersion Condition="'$(PackageValidationBaselineVersion)' == ''">8.1.0</PackageValidationBaselineVersion>
1819
</PropertyGroup>
1920

src/Polly.Core/CircuitBreaker/Controller/CircuitStateController.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,10 +254,14 @@ private static bool IsDateTimeOverflow(DateTimeOffset utcNow, TimeSpan breakDura
254254

255255
private void EnsureNotDisposed()
256256
{
257+
#if NET8_0_OR_GREATER
258+
ObjectDisposedException.ThrowIf(_disposed, this);
259+
#else
257260
if (_disposed)
258261
{
259262
throw new ObjectDisposedException(nameof(CircuitStateController<T>));
260263
}
264+
#endif
261265
}
262266

263267
private void CloseCircuit_NeedsLock(Outcome<T> outcome, bool manual, ResilienceContext context, out Task? scheduledTask)

src/Polly.Core/CircuitBreaker/Controller/ScheduledTaskExecutor.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,14 @@ internal sealed class ScheduledTaskExecutor : IDisposable
1717

1818
public void ScheduleTask(Func<Task> taskFactory, ResilienceContext context, out Task task)
1919
{
20+
#if NET8_0_OR_GREATER
21+
ObjectDisposedException.ThrowIf(_disposed, this);
22+
#else
2023
if (_disposed)
2124
{
2225
throw new ObjectDisposedException(nameof(ScheduledTaskExecutor));
2326
}
27+
#endif
2428

2529
var source = new TaskCompletionSource<object>();
2630
task = source.Task;

src/Polly.Core/Hedging/Controller/HedgingExecutionContext.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,11 @@ public async ValueTask DisposeAsync()
122122

123123
using var delayTaskCancellation = CancellationTokenSource.CreateLinkedTokenSource(PrimaryContext!.CancellationToken);
124124

125+
#if NET8_0_OR_GREATER
126+
var delayTask = Task.Delay(hedgingDelay, _timeProvider, delayTaskCancellation.Token);
127+
#else
125128
var delayTask = _timeProvider.Delay(hedgingDelay, delayTaskCancellation.Token);
129+
#endif
126130
Task<Task> whenAnyHedgedTask = WaitForTaskCompetitionAsync();
127131
var completedTask = await Task.WhenAny(whenAnyHedgedTask, delayTask).ConfigureAwait(ContinueOnCapturedContext);
128132

@@ -133,7 +137,11 @@ public async ValueTask DisposeAsync()
133137

134138
// cancel the ongoing delay task
135139
// Stryker disable once boolean : no means to test this
140+
#if NET8_0_OR_GREATER
141+
await delayTaskCancellation.CancelAsync().ConfigureAwait(ContinueOnCapturedContext);
142+
#else
136143
delayTaskCancellation.Cancel(throwOnFirstException: false);
144+
#endif
137145

138146
await whenAnyHedgedTask.ConfigureAwait(ContinueOnCapturedContext);
139147

src/Polly.Core/Polly.Core.csproj

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFrameworks>net6.0;netstandard2.0;net472;net462</TargetFrameworks>
4+
<TargetFrameworks>net8.0;net6.0;netstandard2.0;net472;net462</TargetFrameworks>
55
<AssemblyTitle>Polly.Core</AssemblyTitle>
66
<RootNamespace>Polly</RootNamespace>
77
<Nullable>enable</Nullable>
@@ -29,6 +29,7 @@
2929

3030
<ItemGroup>
3131
<PackageReference Include="Microsoft.Bcl.AsyncInterfaces" Condition="!$([MSBuild]::IsTargetFrameworkCompatible($(TargetFramework), 'netcoreapp3.1'))" />
32+
<PackageReference Include="Microsoft.Bcl.TimeProvider" Condition="!$([MSBuild]::IsTargetFrameworkCompatible($(TargetFramework), 'net8.0'))" />
3233
<PackageReference Include="System.Threading.Tasks.Extensions" Condition="!$([MSBuild]::IsTargetFrameworkCompatible($(TargetFramework), 'netcoreapp3.1'))" />
3334
<PackageReference Include="System.ValueTuple" Condition="$([MSBuild]::GetTargetFrameworkIdentifier('$(TargetFramework)')) == '.NETFramework'" />
3435
<PackageReference Include="System.ComponentModel.Annotations" Condition="!$([MSBuild]::IsTargetFrameworkCompatible($(TargetFramework), 'netcoreapp3.1'))" />

src/Polly.Core/PublicAPI.Unshipped.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,6 @@ Polly.CircuitBreaker.BreakDurationGeneratorArguments.FailureCount.get -> int
77
Polly.CircuitBreaker.BreakDurationGeneratorArguments.FailureRate.get -> double
88
Polly.CircuitBreaker.CircuitBreakerStrategyOptions<TResult>.BreakDurationGenerator.get -> System.Func<Polly.CircuitBreaker.BreakDurationGeneratorArguments, System.Threading.Tasks.ValueTask<System.TimeSpan>>?
99
Polly.CircuitBreaker.CircuitBreakerStrategyOptions<TResult>.BreakDurationGenerator.set -> void
10+
Polly.ResiliencePipelineBuilderBase.TimeProvider.get -> System.TimeProvider?
11+
Polly.ResiliencePipelineBuilderBase.TimeProvider.set -> void
12+
Polly.StrategyBuilderContext.TimeProvider.get -> System.TimeProvider!

src/Polly.Core/Registry/RegistryPipelineComponentBuilder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ private Builder CreateBuilder()
5959
builder.InstanceName = _instanceName;
6060
_configure(builder, context);
6161

62-
var timeProvider = builder.TimeProvider;
62+
var timeProvider = builder.TimeProviderInternal;
6363
var telemetry = new ResilienceStrategyTelemetry(
6464
new ResilienceTelemetrySource(builder.Name, builder.InstanceName, null),
6565
builder.TelemetryListener);

0 commit comments

Comments
 (0)