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)`有什么区别?
基础教程推荐
- 经典 Asp 中的 ResolveUrl/Url.Content 等效项 2022-01-01
- 首先创建代码,多对多,关联表中的附加字段 2022-01-01
- 在 VS2010 中的 Post Build 事件中将 bin 文件复制到物 2022-01-01
- 将事件 TextChanged 分配给表单中的所有文本框 2022-01-01
- JSON.NET 中基于属性的类型解析 2022-01-01
- 错误“此流不支持搜索操作"在 C# 中 2022-01-01
- 是否可以在 asp classic 和 asp.net 之间共享会话状态 2022-01-01
- 如何动态获取文本框中datagridview列的总和 2022-01-01
- 全局 ASAX - 获取服务器名称 2022-01-01
- 从 VS 2017 .NET Core 项目的发布目录中排除文件 2022-01-01
