Skip to content

Commit a45c4ad

Browse files
authored
Avoid pausing circuit simultaneously with disposing of it (#63010)
* Use single threaded dispatcher to make sure pausing does not happen concurrently with disposal.
1 parent fab448a commit a45c4ad

File tree

1 file changed

+21
-18
lines changed

1 file changed

+21
-18
lines changed

src/Components/Server/src/Circuits/CircuitPersistenceManager.cs

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -21,26 +21,29 @@ internal partial class CircuitPersistenceManager(
2121
{
2222
public async Task PauseCircuitAsync(CircuitHost circuit, bool saveStateToClient = false, CancellationToken cancellation = default)
2323
{
24-
var renderer = circuit.Renderer;
25-
var persistenceManager = circuit.Services.GetRequiredService<ComponentStatePersistenceManager>();
26-
var collector = new CircuitPersistenceManagerCollector(circuitOptions, serverComponentSerializer, circuit.Renderer);
27-
using var subscription = persistenceManager.State.RegisterOnPersisting(
28-
collector.PersistRootComponents,
29-
RenderMode.InteractiveServer);
24+
await circuit.Renderer.Dispatcher.InvokeAsync(async () =>
25+
{
26+
var renderer = circuit.Renderer;
27+
var persistenceManager = circuit.Services.GetRequiredService<ComponentStatePersistenceManager>();
28+
var collector = new CircuitPersistenceManagerCollector(circuitOptions, serverComponentSerializer, circuit.Renderer);
29+
using var subscription = persistenceManager.State.RegisterOnPersisting(
30+
collector.PersistRootComponents,
31+
RenderMode.InteractiveServer);
3032

31-
await persistenceManager.PersistStateAsync(collector, renderer);
33+
await persistenceManager.PersistStateAsync(collector, renderer);
3234

33-
if (saveStateToClient)
34-
{
35-
await SaveStateToClient(circuit, collector.PersistedCircuitState, cancellation);
36-
}
37-
else
38-
{
39-
await circuitPersistenceProvider.PersistCircuitAsync(
40-
circuit.CircuitId,
41-
collector.PersistedCircuitState,
42-
cancellation);
43-
}
35+
if (saveStateToClient)
36+
{
37+
await SaveStateToClient(circuit, collector.PersistedCircuitState, cancellation);
38+
}
39+
else
40+
{
41+
await circuitPersistenceProvider.PersistCircuitAsync(
42+
circuit.CircuitId,
43+
collector.PersistedCircuitState,
44+
cancellation);
45+
}
46+
});
4447
}
4548

4649
internal async Task SaveStateToClient(CircuitHost circuit, PersistedCircuitState state, CancellationToken cancellation = default)

0 commit comments

Comments
 (0)