※最新記事はこちら -> Blazor Server で実現する最もシンプルな非同期処理の実装
.Net Core 5.0 で、Blazor Server 画面を実装中、EFCoreを使ったDB処理と、Blazor画面との連携で、DB処理の非同期化が上手くいかず、「処理中オーバーレイ」が表示されずハマった。
・StateHasChanged() 実行箇所を増やしても解消せず。
・O/Rマッパーを、EFCoreではなく、Dapperに変更しても解消せず。
・await Task.Delay(1); を実行し、スレッドを画面に強制的に一旦戻すことで解消。
実装した 「処理中オーバーレイ」 画面。
処理ボタンがクリックされたら、前面に回転するオブジェクトをオーバーレイで表示し、裏面の画面操作を禁止する。

オーバーレイを表示しているRazorページ。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | @page "/Stock/StockName" @inject ILogger<StockName> _Logger @inject ProtectedSessionStorage ProtectedSessionStore @inject ApplicationDbContext _DbContext     @if (IsLoadingOverlay)     {         <div id="loading">             <div class="w-100 d-flex justify-content-center align-items-center">                 <div class="spinner-border text-primary spinner-custom" role="status"></div>             </div>         </div>     } | 
処理中はオーバーレイを表示し、処理が終わったらオーバーレイを非表示にしている、 Razorページのイベントハンドラ。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | <button type="button" class="btn btn-min btn-primary mr-2" @onclick="Test">検索</button> @code {     private bool IsLoadingOverlay = false;     private async Task Test()     {         try         {             IsLoadingOverlay = true;             await Task.Delay(1); // これをしないと、画面にスレッドが切り替わらず、オーバーレイが表示されない。StateHasChanged()でもだめ。             //              // DB処理などの重い処理             //              IsLoadingOverlay = false;         }         catch (Exception ex)         {             Error.ProcessErrorSync(ex);         }     } } | 
 
  
  
  
  

コメント