2020年12月06日
川俣晶の縁側ソフトウェア技術雑記 total 2405 count

.NET 5におけるBlazor WebAssemblyのマルチスレッド対応状況のまとめ

Written By: 川俣 晶連絡先

  • かつて、Blazor WebAssemblyのマルチスレッド対応は.NET 5とされていたが実現されていない
  • 現在は.NET 6のロードマップに乗っている(Real multithreading (on supported browsers))
  • async/awaitを利用した擬似マルチタスクは動作するが、UIスレッドの実行権をawaitでシステムに返さないとハングしてしまう問題がある
  • JavaScriptのWorkerの仕組みを利用したマルチスレッドのライブラリとしてTewr/BlazorWorkerがあるが、自分の手元では2.0.0が正常に動いていない (コンパイルエラーになる)

 現状の選択肢はおそらく3つ。

  • .NET 6を待つ (.NET 5を待っても実現されなかった実績があるので、不確定。そもそもWebAssemblyの仕様に含まれないらしい。個別ブラウザのスレッドの実装はある)
  • async/awaitを利用した擬似マルチタスクでお茶を濁す (機能的な制約は大きい)
  • Tewr/BlazorWorkerで対処する (しかし、メモリはスレッド間で共有されないので、Workerの制約をまるまるかぶる)

 決定版の解決策はない。いかに制約と機能の妥協を探るかだろう。

 とりあえず、Web関係者の危機感の無さと無能っぷりは本当に酷い。

 あの使いにくいJavaScriptを何年も放置して知らん顔をしていたのに、まだ同じことが繰り返されている。

オマケ §

 .NET 5のBlazor WAでWaitメソッドはPlatformNotSupportedExceptionになって動作しないようだ。awaitは動作する。実行がブロックされることを理解した上でWaitメソッドで待たせるコードは記述することができない模様。