File tree 2 files changed +39
-1
lines changed
2 files changed +39
-1
lines changed Original file line number Diff line number Diff line change @@ -170,7 +170,18 @@ await Renderer.Dispatcher.InvokeAsync(async () =>
170
170
try
171
171
{
172
172
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
+
174
185
Log . DisposeSucceeded ( _logger , CircuitId ) ;
175
186
}
176
187
catch ( Exception ex )
Original file line number Diff line number Diff line change @@ -39,6 +39,33 @@ public async Task DisposeAsync_DisposesResources()
39
39
Assert . Null ( circuitHost . Handle . CircuitHost ) ;
40
40
}
41
41
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
+
42
69
[ Fact ]
43
70
public async Task DisposeAsync_DisposesResourcesAndSilencesException ( )
44
71
{
You can’t perform that action at this time.
0 commit comments