Blazor WebAssembly多线程模式下UI更新问题求助
Blazor WebAssembly .NET多线程模式下UI更新异常问题
我测试了Blazor WebAssembly在.NET8(及.NET7实验版)新增的多线程支持功能,参考官方多线程相关文档。
测试代码
<p role="status">Current text: @screenData</p> <button class="btn btn-primary" @onclick="ButtonClicked">Click me</button> @code { private string screenData = ""; private async void ButtonClicked() { Console.WriteLine("Message1,MyThreadID:" + System.Threading.Thread.CurrentThread.ManagedThreadId); screenData = "AfterMessage1"; await Task.Run(async () => { Console.WriteLine("Message2,MyThreadID:" + System.Threading.Thread.CurrentThread.ManagedThreadId); await Task.Delay(1000); Console.WriteLine("Message3,MyThreadID:" + System.Threading.Thread.CurrentThread.ManagedThreadId); await InvokeAsync(() => { screenData = "AfterMessage3"; Console.WriteLine("Message4,MyThreadID:" + System.Threading.Thread.CurrentThread.ManagedThreadId); }); }); Console.WriteLine("Message5,MyThreadID:" + System.Threading.Thread.CurrentThread.ManagedThreadId); screenData = "AfterMessage5"; } }
控制台输出(UI未同步更新)
Message1,MyThreadID:1 Message2,MyThreadID:2 Message3,MyThreadID:4 Message4,MyThreadID:4 Message5,MyThreadID:1
补充:第二次点击按钮时,UI才会显示第一次点击后的"AfterMessage5"。
额外问题场景
启用多线程模式后,如下简单代码也无法更新标签,禁用多线程则正常工作:
private async void ButtonClicked() { await Task.Delay(100); screenData = "Text To Label"; }
疑问
- 如何从子线程调用ID为1的UI线程?我需要在后台执行耗时数秒的任务,并将结果实时更新到UI,但目前无法实现子线程与UI线程的交互。
- 有没有其他开发者遇到过Blazor WebAssembly多线程相关的UI更新问题?盼解答。
内容的提问来源于stack exchange,提问作者Ender KARADAG
相关产品推荐
相关产品推荐

