本文介绍了在Blazor中,`等待任务.Run(StateHasChanged)`和`等待InvokeAsync(StateHasChanged)`有什么区别?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我最近继承了Blazor WebAssembly应用程序,但对DotNet或Blazor几乎没有经验。
某些组件使用await Task.Run(StateHasChanged)
而不是await InvokeAsync(StateHasChanged)
,我想知道这是否是故意的。
I Ask Asawait Task.Run(StateHasChanged);
在尝试使用bUnit呈现组件时出现以下异常:
将其更改为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)`有什么区别?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!