From 9f9e22a8edff6b4352c42e8e8da5e4d648864539 Mon Sep 17 00:00:00 2001 From: Luke Latham <1622880+guardrex@users.noreply.github.com> Date: Tue, 11 Jul 2023 07:05:19 -0400 Subject: [PATCH] Cross-link sync context content (#29764) --- aspnetcore/blazor/components/rendering.md | 8 ++++---- aspnetcore/blazor/state-management.md | 10 ++++++++++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/aspnetcore/blazor/components/rendering.md b/aspnetcore/blazor/components/rendering.md index 985a0015fa..b394ac8226 100644 --- a/aspnetcore/blazor/components/rendering.md +++ b/aspnetcore/blazor/components/rendering.md @@ -142,25 +142,25 @@ Because the callback is invoked outside of Blazor's synchronization context, the ::: moniker range=">= aspnetcore-7.0" -:::code language="razor" source="~/../blazor-samples/7.0/BlazorSample_WebAssembly/Pages/rendering/CounterState2.razor" highlight="26"::: +:::code language="razor" source="~/../blazor-samples/7.0/BlazorSample_WebAssembly/Pages/rendering/CounterState2.razor" highlight="23-27"::: ::: moniker-end ::: moniker range=">= aspnetcore-6.0 < aspnetcore-7.0" -:::code language="razor" source="~/../blazor-samples/6.0/BlazorSample_WebAssembly/Pages/rendering/CounterState2.razor" highlight="26"::: +:::code language="razor" source="~/../blazor-samples/6.0/BlazorSample_WebAssembly/Pages/rendering/CounterState2.razor" highlight="23-27"::: ::: moniker-end ::: moniker range=">= aspnetcore-5.0 < aspnetcore-6.0" -:::code language="razor" source="~/../blazor-samples/5.0/BlazorSample_WebAssembly/Pages/rendering/CounterState2.razor" highlight="26"::: +:::code language="razor" source="~/../blazor-samples/5.0/BlazorSample_WebAssembly/Pages/rendering/CounterState2.razor" highlight="23-27"::: ::: moniker-end ::: moniker range="< aspnetcore-5.0" -:::code language="razor" source="~/../blazor-samples/3.1/BlazorSample_WebAssembly/Pages/rendering/CounterState2.razor" highlight="26"::: +:::code language="razor" source="~/../blazor-samples/3.1/BlazorSample_WebAssembly/Pages/rendering/CounterState2.razor" highlight="23-27"::: ::: moniker-end diff --git a/aspnetcore/blazor/state-management.md b/aspnetcore/blazor/state-management.md index a45c5493e8..6ca80db977 100644 --- a/aspnetcore/blazor/state-management.md +++ b/aspnetcore/blazor/state-management.md @@ -652,6 +652,16 @@ When implementing custom state storage, a useful approach is to adopt [cascading For additional discussion and example approaches, see [Blazor: In-memory state container as cascading parameter (dotnet/AspNetCore.Docs #27296)](https://github.com/dotnet/AspNetCore.Docs/issues/27296). +## Troubleshoot + +In a custom state management service, a callback invoked outside of Blazor's synchronization context must wrap the logic of the callback in to move it onto the renderer's synchronization context. + +When the state management service doesn't call on Blazor's synchronization context, the following error is thrown: + +> :::no-loc text="System.InvalidOperationException: 'The current thread is not associated with the Dispatcher. Use InvokeAsync() to switch execution to the Dispatcher when triggering rendering or component state.'"::: + +For more information and an example of how to address this error, see . + ## Additional resources * [Save app state before an authentication operation](xref:blazor/security/webassembly/additional-scenarios#save-app-state-before-an-authentication-operation)