目的:
在工程中创立子线程能帮助轻松的实现很多功能,例如定时功能、状态监控功能等。
Blazor server工程支持创建Thread线程,但是Blazor WebAssembly工程不支持,不过好在可以利用Task异步的方式创建。
本文将给出在Blazor WebAssembly工程中创建一个用作程序运行状态监控的子线程;
代码:
该示例中使用Task在根布局组件的OnAfterRenderAsync函数重载中创建,不会阻塞主线程,相当于每隔一毫秒会执行一次cycleFunc()函数,该函数内将写有各种监控逻辑,如示例中的计时更新逻辑就是用于一个计时页面计算时间用的,可做到每执行一次就刷新目标计时组件,达到持续计时不卡住的目的。
注意:
!Task异步任务(线程)必须写在OnAfterRenderAsync函数重载中,且必须是异步,如上图所示。
!必须使用InvokeAsync包一层;
原因和组件生命周期有关,也没有其他的写法,背下来直接用就好了。有兴趣的可以深究一下原理;
将子线程封装进控件组件的尝试
这种在组件中创建线程的时候,尽量不要调用局部变了。
曾经试过在一个弹框组件内常见线程来实现3秒控制计数,参与计算的有记录弹框显示时间的DateTime局部变量,但是导致了组件卡死。
尝试将局部变量改为用其他位置(如静态类)的变量后问题解决。
但是因为无法做到绝对的模块化,所以最后还是把该逻辑从控件组件内部搬到了总的子线程中,做统一管理;