我最近繼承了 Blazor Webassembly 應用程式,但對 dotnet 或 Blazor 的經驗很少。
一些組件使用await Task.Run(StateHasChanged)而不是await InvokeAsync(StateHasChanged),我想知道這是否是故意的。
await Task.Run(StateHasChanged);嘗試使用 bUnit 呈現組件時,我問 as給了我以下例外:
System.InvalidOperationException 當前執行緒未與 Dispatcher 關聯。觸發渲染或組件狀態時,使用 InvokeAsync() 將執行切換到 Dispatcher。
將此更改為await InvokeAsync(StateHasChanged);允許組件在 bUnit 中呈現。但是,據我所知,在將應用程式用于await Task.Run(StateHasChanged)或時,組件的功能相同await InvokeAsync(StateHasChanged)。
這兩種呼叫方法有什么區別StateHasChanged?
uj5u.com熱心網友回復:
據我所知,該組件的功能相同......
那是正確的。Task.Run(job)將在 ThreadPool 上運行作業。然而,在 WebAssembly 中沒有額外的執行緒,主(唯一)執行緒遲早必須運行此作業。
在 Blazor 服務器中,您確實有執行緒。Task.Run()將在那里作業,但StateHasChanged() 必須在主執行緒上運行。這意味著
await Task.Run(StateHasChanged) // bug! Don't do this.
絕對是一個錯誤,無處不在。它暫時在 WebAssembly 上沒有引起注意。直到 Blazor Wasm 也獲得執行緒的那一天,它才會拋出。
所以 bUnit 是對的,修復你的代碼。
請注意,在“正常”生命周期事件(如 OnInitialized[Async]、OnClick、OnSubmit 等)中,您根本不必使用InvokeAsync()。我通常只使用
StateHasChanged();
并在外部事件(例如計時器)或執行緒代碼(在服務器上)
await InvokeAsync(StateHasChanged);
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/369849.html
