Skip to content

Commit f8b1eb5

Browse files
committed
Use single threaded dispatcher to make sure pausing does not happen concurently with disposal.
1 parent d67b511 commit f8b1eb5

File tree

1 file changed

+24
-21
lines changed

1 file changed

+24
-21
lines changed

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

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -21,31 +21,34 @@ internal partial class CircuitPersistenceManager(
2121
{
2222
public async Task PauseCircuitAsync(CircuitHost circuit, bool saveStateToClient = false, CancellationToken cancellation = default)
2323
{
24-
if (circuit.IsDisposed())
24+
await circuit.Renderer.Dispatcher.InvokeAsync(async () =>
2525
{
26-
return;
27-
}
26+
if (circuit.IsDisposed())
27+
{
28+
return;
29+
}
2830

29-
var renderer = circuit.Renderer;
30-
var persistenceManager = circuit.Services.GetRequiredService<ComponentStatePersistenceManager>();
31-
var collector = new CircuitPersistenceManagerCollector(circuitOptions, serverComponentSerializer, circuit.Renderer);
32-
using var subscription = persistenceManager.State.RegisterOnPersisting(
33-
collector.PersistRootComponents,
34-
RenderMode.InteractiveServer);
31+
var renderer = circuit.Renderer;
32+
var persistenceManager = circuit.Services.GetRequiredService<ComponentStatePersistenceManager>();
33+
var collector = new CircuitPersistenceManagerCollector(circuitOptions, serverComponentSerializer, circuit.Renderer);
34+
using var subscription = persistenceManager.State.RegisterOnPersisting(
35+
collector.PersistRootComponents,
36+
RenderMode.InteractiveServer);
3537

36-
await persistenceManager.PersistStateAsync(collector, renderer);
38+
await persistenceManager.PersistStateAsync(collector, renderer);
3739

38-
if (saveStateToClient)
39-
{
40-
await SaveStateToClient(circuit, collector.PersistedCircuitState, cancellation);
41-
}
42-
else
43-
{
44-
await circuitPersistenceProvider.PersistCircuitAsync(
45-
circuit.CircuitId,
46-
collector.PersistedCircuitState,
47-
cancellation);
48-
}
40+
if (saveStateToClient)
41+
{
42+
await SaveStateToClient(circuit, collector.PersistedCircuitState, cancellation);
43+
}
44+
else
45+
{
46+
await circuitPersistenceProvider.PersistCircuitAsync(
47+
circuit.CircuitId,
48+
collector.PersistedCircuitState,
49+
cancellation);
50+
}
51+
});
4952
}
5053

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

0 commit comments

Comments
 (0)