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)`有什么区别?
基础教程推荐
- 如果有人提交恶意软件Nuget包怎么办? 2022-01-01
- 禁止输入少量字符,例如'<'、'&a 2022-01-01
- 我应该在后面的代码中直接使用 Linq To SQL 还是使 2022-01-01
- WPF 模态进度窗口 2022-01-01
- 当值可以是对象或空数组时反序列化 JSON 2022-01-01
- C# 从 List<List<int>> 中删除重 2022-01-01
- Azure Functions:CosmosDBTrigger 未在 Visual Studio 中触发 2022-01-01
- 如何使用 .Net 检查 Active Directory 服务器是否已启动并正在运行? 2022-01-01
- .NET SerialPort DataReceived 事件未触发 2022-01-01
- Moq It.Is<>不匹配 2022-01-01
