StateHasChanged() vs InvokeAsync(StateHasChanged)


blazor 渲染和調用 StateHasChanged 都必須發生在主(UI)執行緒上

而主要的 Blazor 生命週期事件(OnInit、AfterRender、ButtonClick)都在該特殊執行緒上執行,
因此在極少數情況下 StateHasChanged() 可以在沒有 InvokeAsync() 的情況下調用它。

Timer 內調用 StateHasChanged()

Timer 是一個“外部事件”,所以你不能確定它會在正確的線程上執行。
InvokeAsync() 將工作委託給 Blazor 的 SynchronizationContext,這將確保它確實在主線程上運行。

但是 Blazor WebAssembly 只有 1 個線程,所以暫時外部事件也總是在主執行緒上運行。這意味著當你把這個 Invoke 模式弄錯時,
你並不會發現錯誤。

An unhandled error has occurred. Reload 🗙