問題 §
Blazor Serverのアプリで画面が更新されない。
全く同じソースをBlazor Web Asssemblyに持っていくと更新される。
原因 §
マルチスレッドの動作が互換ではないから。
Blazorにも別スレッドからの画面更新要求は受理できない制約があり、Blazor Serverではこの条件に当てはまる可能性がある。
一方で、Blazor Web Asssemblyではマルチスレッドはまだ使えない。Taskは実行権が空いたときだけ実行されるチャンスがあるが常に同じスレッドで実行されるので、別スレッドからの画面更新要求は発生しない。
解決 §
InvokeAsyncメソッドを使って、メインスレッドで画面更新要求(StateHasChanged呼び出し)を行う。
(InvokeAsyncメソッドはBlazor Web Asssemblyでも動作するので、これを使っておけば安全である。ただし、InvokeAsyncの動作をブロックするとハングする可能性がある。awaitを使っておけばたぶん安全)