diff --git a/docs/building.md b/docs/building.md index 5d042c9bf87..b7845cd6945 100644 --- a/docs/building.md +++ b/docs/building.md @@ -157,6 +157,15 @@ This sets up necessary environmental variables and opens the repository in VS Co * When restoring packages, if you get the following message: "The SSL connection could not be established, see inner exception. Unable to read data from the transport connection", try disabling IPv6 on your network adapter. * When the public API surface is updated, you need to update the API baselines manifest files for the impacted assemblies. [Here is an example](https://github.com/dotnet/extensions/blob/3e6ac0735cb62d4c8b63e131d956397a87ea26f7/src/Libraries/Microsoft.Extensions.AsyncState/Microsoft.Extensions.AsyncState.json) for the `Microsoft.Extensions.AsyncState` project. To update the manifest of all the local assemblies, invoke the script `./scripts/MakeApiBaselines.ps1`. +#### How to fix "Workload manifest microsoft.net.sdk.aspire not installed"? + +At times, during restore you may receive the following error: +``` +error MSB4242: SDK Resolver Failure: "The SDK resolver "Microsoft.DotNet.MSBuildWorkloadSdkResolver" failed while attempting to resolve the SDK "Microsoft.DotNet.Arcade.Sdk". +Exception: "System.IO.FileNotFoundException: Workload manifest microsoft.net.sdk.aspire: 8.0.1/8.0.100 from workload version was not installed. Running "dotnet workload repair" may resolve this. +``` + +This error is, generally, caused by multiple SDK installations under \/.dotnet folder. To resolve the issue, run `git clean -xdf` and then run restore again. --- diff --git a/src/Libraries/Microsoft.Extensions.TimeProvider.Testing/Timer.cs b/src/Libraries/Microsoft.Extensions.TimeProvider.Testing/Timer.cs index c6d7bf5ab1f..926e500166f 100644 --- a/src/Libraries/Microsoft.Extensions.TimeProvider.Testing/Timer.cs +++ b/src/Libraries/Microsoft.Extensions.TimeProvider.Testing/Timer.cs @@ -37,16 +37,18 @@ public bool Change(TimeSpan dueTime, TimeSpan period) _ = Throw.IfOutOfRange(periodMs, -1, MaxSupportedTimeout, nameof(period)); #pragma warning restore S3236 // Caller information arguments should not be provided explicitly - if (_timeProvider == null) + var timeProvider = _timeProvider; + if (timeProvider is null) { // timer has been disposed return false; } - if (_waiter != null) + var waiter = _waiter; + if (waiter is not null) { // remove any previous waiter - _timeProvider.RemoveWaiter(_waiter); + timeProvider.RemoveWaiter(waiter); _waiter = null; } @@ -62,8 +64,8 @@ public bool Change(TimeSpan dueTime, TimeSpan period) period = TimeSpan.Zero; } - _waiter = new Waiter(_callback!, _state, period.Ticks); - _timeProvider.AddWaiter(_waiter, dueTime.Ticks); + _waiter = waiter = new Waiter(_callback!, _state, period.Ticks); + timeProvider.AddWaiter(waiter, dueTime.Ticks); return true; } @@ -89,9 +91,10 @@ public ValueTask DisposeAsync() private void Dispose(bool _) { - if (_waiter != null) + var waiter = _waiter; + if (waiter is not null) { - _timeProvider!.RemoveWaiter(_waiter); + _timeProvider?.RemoveWaiter(waiter); _waiter = null; }