Skip to content

Commit 13fc89c

Browse files
committed
Dispose DI scope with async support in circuit host
Fixes part of #12918 This fixes the part of this issue that we're going to be able to do in 3.0 safely.
1 parent e5a950d commit 13fc89c

File tree

2 files changed

+39
-1
lines changed

2 files changed

+39
-1
lines changed

src/Components/Server/src/Circuits/CircuitHost.cs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,18 @@ await Renderer.Dispatcher.InvokeAsync(async () =>
170170
try
171171
{
172172
Renderer.Dispose();
173-
_scope.Dispose();
173+
174+
// This cast is needed because it's possible the scope may not support async dispose.
175+
// Our DI container does, but other DI systems may not.
176+
if (_scope is IAsyncDisposable asyncDisposable)
177+
{
178+
await asyncDisposable.DisposeAsync();
179+
}
180+
else
181+
{
182+
_scope.Dispose();
183+
}
184+
174185
Log.DisposeSucceeded(_logger, CircuitId);
175186
}
176187
catch (Exception ex)

src/Components/Server/test/Circuits/CircuitHostTest.cs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,33 @@ public async Task DisposeAsync_DisposesResources()
3939
Assert.Null(circuitHost.Handle.CircuitHost);
4040
}
4141

42+
[Fact]
43+
public async Task DisposeAsync_DisposesScopeAsynchronouslyIfPossible()
44+
{
45+
// Arrange
46+
var serviceScope = new Mock<IServiceScope>();
47+
serviceScope
48+
.As<IAsyncDisposable>()
49+
.Setup(f => f.DisposeAsync())
50+
.Returns(new ValueTask(Task.CompletedTask))
51+
.Verifiable();
52+
53+
var remoteRenderer = GetRemoteRenderer();
54+
var circuitHost = TestCircuitHost.Create(
55+
Guid.NewGuid().ToString(),
56+
serviceScope.Object,
57+
remoteRenderer);
58+
59+
// Act
60+
await circuitHost.DisposeAsync();
61+
62+
// Assert
63+
serviceScope.Verify(s => s.Dispose(), Times.Never());
64+
serviceScope.As<IAsyncDisposable>().Verify(s => s.DisposeAsync(), Times.Once());
65+
Assert.True(remoteRenderer.Disposed);
66+
Assert.Null(circuitHost.Handle.CircuitHost);
67+
}
68+
4269
[Fact]
4370
public async Task DisposeAsync_DisposesResourcesAndSilencesException()
4471
{

0 commit comments

Comments
 (0)