In Blazor what is the difference between `await Task.Run(StateHasChanged)` and `await InvokeAsync(StateHasChanged)`?(在Blazor中,`等待任务.Run(StateHasChanged)`和`等待InvokeAsync(StateHasChanged)`有什么区别?)
问题描述
我最近继承了Blazor WebAssembly应用程序,但对DotNet或Blazor几乎没有经验。
某些组件使用await Task.Run(StateHasChanged)而不是await InvokeAsync(StateHasChanged),我想知道这是否是故意的。
I Ask Asawait Task.Run(StateHasChanged);在尝试使用bUnit呈现组件时出现以下异常:
当前线程未关联的System.InvalidOperationException 和调度员在一起。使用InvokeAsync()将执行切换到 触发呈现或组件状态时的调度程序。
将其更改为await InvokeAsync(StateHasChanged);允许在bUnit中呈现组件。但是,据我所知,将应用程序用于await Task.Run(StateHasChanged)或await InvokeAsync(StateHasChanged)时,组件的功能相同。
这两种调用StateHasChanged的方法有什么不同?
推荐答案
据我所知,组件的功能相同.
这是正确的。Task.Run(job)将在线程池上运行作业。但是,在WebAssembly中没有额外的线程,并且主线程(仅限)迟早必须运行此作业。
在Blazor Server中,您确实有线程。Task.Run()将在那里运行,但StateHasChanged()必须在主线程上运行。这意味着
await Task.Run(StateHasChanged) // bug! Don't do this.
绝对是个bug,无处不在。只是暂时没有在WebAssembly上引起注意。直到Blazor Wasm也获得线程的那一天,它才会抛出。
因此bUnit是正确的,请修复您的代码。
请注意,在"正常"生命周期事件(如OnInitialized[Async]、OnClick、OnSubmit等)中,您根本不需要使用InvokeAsync()。
我通常只用
StateHasChanged();
在外部事件(如计时器)或线程代码(在服务器上)中
await InvokeAsync(StateHasChanged);
这篇关于在Blazor中,`等待任务.Run(StateHasChanged)`和`等待InvokeAsync(StateHasChanged)`有什么区别?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:在Blazor中,`等待任务.Run(StateHasChanged)`和`等待InvokeAsync(StateHasChanged)`有什么区别?
基础教程推荐
- Mono https webrequest 失败并显示“身份验证或解密失败" 2022-01-01
- 重新排序 WPF TabControl 中的选项卡 2022-01-01
- 如果条件可以为空 2022-01-01
- 获取C#保存对话框的文件路径 2022-01-01
- SonarQube C# 分析失败“不是指针的有效行偏移" 2022-01-01
- 从 C# 控制相机设备 2022-01-01
- 在 VB6 或经典 ASP 中使用 .NET 2022-01-01
- 将数据集转换为列表 2022-01-01
- 更新 Visual Studio 中的 DataSet 结构以匹配新的 SQL 数据库结构 2022-01-01
- C# 9 新特性——record的相关总结 2023-04-03
