在Blazor中,`等待任务.Run(StateHasChanged)`和`等待InvokeAsync(StateHasChanged)`有什么区别? [英] In Blazor what is the difference between `await Task.Run(StateHasChanged)` and `await InvokeAsync(StateHasChanged)`?

查看:32
本文介绍了在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)`有什么区别?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆