我最近继承了 Blazor Webassemble 应用程序,但对 dotnet 或 Blazor 的经验很少。
一些组件使用await Task.Run(StateHasChanged)
而不是await InvokeAsync(StateHasChanged)
我想知道这是否是故意的。
我问作为await Task.Run(StateHasChanged);
尝试使用 bUnit 渲染组件时出现以下异常:
System.InvalidOperationException 当前线程未关联
与调度员。使用 InvokeAsync() 将执行切换到
触发渲染或组件状态时的调度程序。
将此更改为await InvokeAsync(StateHasChanged);
允许组件在 bUnit 中渲染。然而,据我所知,当使用该应用程序时,该组件的功能是相同的await Task.Run(StateHasChanged)
or await InvokeAsync(StateHasChanged)
.
这两种调用方式有什么区别StateHasChanged
?
据我所知,该组件的功能相同......
那是对的。Task.Run(job)
将在线程池上运行作业。然而,在 WebAssembly 中,没有额外的线程,主(唯一)线程迟早必须运行此作业。
在 Blazor Server 中,您确实有线程。Task.Run()
会在那里工作,但是StateHasChanged()
has to在主线程上运行。这意味着
await Task.Run(StateHasChanged) // bug! Don't do this.
绝对是一个错误,无处不在。它暂时在 WebAssembly 上未被注意到。直到 Blazor Wasm 也获得线程的那一天,它才会抛出异常。
所以 bUnit 是对的,修复你的代码。
请注意,在“正常”生命周期事件(如 OnInitialized[Async]、OnClick、OnSubmit 等)中,您不必使用InvokeAsync()
根本不。
我通常只使用
StateHasChanged();
以及外部事件(例如计时器)或线程代码(在服务器上)
await InvokeAsync(StateHasChanged);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)