blazor - 如何在 Blazor WebAssembly 中实现外部异步操作完成?
问题描述
我正在寻找关于如何在 Blazor WebAssembly 中实现外部异步操作完成的高级描述,我最感兴趣的是它如何用于计时器(Task.Delay
等)和 JS 互操作。
我知道 Blazor WASM 是单线程的,所以肯定有一些事件循环,或者甚至可能是调用 WASM 代码的 JS 事件循环,它会暂时激活 WASM 事件循环/.NET 线程池事件循环。但是,问题是:一旦 .NET 线程池工作项队列变空会发生什么 - 即现在没有更多任务要继续,但它们预计会在未来弹出(由于计时器和 JS 互操作调用) ? 我看到的一些选项是:
- 继续在 .NET / WASM 中旋转并轮询共享缓冲区,通过该缓冲区编组 JS-to-.NET 调用;一旦有新的呼叫条目,将其转换为工作项并尽可能运行;之后冲洗并重复。这种方法的缺点是相当高的 CPU 消耗:基本上,这里没有“临时暂停等待 IO 完成的线程”的概念。
- 将控件返回给 JS 代码并停止执行 .NET 代码。这个选项意味着诸如计时器和 IO 之类的东西都是通过 JS 互操作传递的。这里 CPU 消耗高没有问题,但在这种情况下,拥有计时器或等待 IO 完成的成本可能会更高。
- 这些选项的混合。例如,.NET 线程池代码可能决定保留控件以等待几乎准备好触发的计时器,但如果没有此类计时器,则将控件释放给 JS。
总的来说,我想知道这实际上是如何工作的。高层次的描述已经足够了,不过如果你没有太多时间来写它,源代码的链接也可以。
解决方案
推荐阅读
- kdb - q中无法获取写入的文件内容?
- reactjs - React - 存储更新但没有重新渲染组件
- dsl - 为什么我们在空手道报告中使用 karate.abort() 将“跳过步骤”视为“失败的步骤”?
- solr - 使用 tika 索引某些文档后如何从 solr 关键字搜索中获取段落结果?
- python - 如何在 Python 包中支持备用依赖项?
- javascript - 我在将值附加到数组中时遇到问题
- ibm-watson - 如何让麦克风直接流式传输到 watson speechToText 服务
- javascript - React 只重新渲染修改过的 contenteditable 一次
- elasticsearch - ElasticSearch Kibana 监控数据开始丢失数据
- php - 如何在 TCPDF 中编码 UTF-8