2019年12月24日
川俣晶の縁側ソフトウェア技術雑記 total 3694 count

Blazor Serverで画面が更新されない (Web Asssemblyなら更新される)

Written By: 川俣 晶連絡先

問題 §

 Blazor Serverのアプリで画面が更新されない。

 全く同じソースをBlazor Web Asssemblyに持っていくと更新される。

原因 §

 マルチスレッドの動作が互換ではないから。

 Blazorにも別スレッドからの画面更新要求は受理できない制約があり、Blazor Serverではこの条件に当てはまる可能性がある。

 一方で、Blazor Web Asssemblyではマルチスレッドはまだ使えない。Taskは実行権が空いたときだけ実行されるチャンスがあるが常に同じスレッドで実行されるので、別スレッドからの画面更新要求は発生しない。

解決 §

 InvokeAsyncメソッドを使って、メインスレッドで画面更新要求(StateHasChanged呼び出し)を行う。

 (InvokeAsyncメソッドはBlazor Web Asssemblyでも動作するので、これを使っておけば安全である。ただし、InvokeAsyncの動作をブロックするとハングする可能性がある。awaitを使っておけばたぶん安全)