c# - 在设计文档树模型时,加载或查询该模型的方法是否应该是异步的?
问题描述
我很难提出这个问题,尤其是这实际上是两个相关的问题。
我将创建一个库,该库对任何 dotnet 库/包/项目的 API 文档进行建模,以供以后使用以实时表示此类 API 文档,而无需工具来生成文档的 html 形式或不使用智能感知。
它的基础是某种通用文档模型,对命名空间/程序集树、类型、类型成员、扩展方法等以及相关文档(如果有)进行建模。可能有两个文档来源,但它们各自的工作方式不同。一种是带有预计算文档的数据库。在这种情况下,我可以打开数据库,并对其进行惰性查询以获取模型的其他部分。数据库很有用,因为我不必从不同来源加载文档,也不必将整个文档树保存在内存中。
第二个来源是编译器 api。因此,通常,从 c# 源文件(如果有)或程序集 + xml 文档或 nuget 包或上述任何组合加载文档树。在这种情况下可能不太可能进行延迟加载,因为例如,在命名空间树视图的情况下,这意味着查看所有已加载程序集的所有命名空间等。所以,这意味着整个文档树模型是在记忆中。
所以:
- 从源和程序集元数据计算文档的方法应该是异步的,还是具有异步版本?它可能会执行大量 IO 来读取 c# 或其他源文件/元数据/等,但在解析源、读取元数据、解析 xml、将所有这些转换为通用模型时也会执行大量 CPU 工作,并且可能还会做一些更繁重的事情,比如为给定类型计算可应用的扩展方法,这可能有点繁重。
- 模型本身中查询模型的方法(例如,类型描述中的方法以获取所有类型成员)应该是异步的还是具有异步版本?在内存树的情况下,我可以同步得到答案。但是在文档数据库/缓存的情况下,我不会将所有内容都保存在内存中,因此方法将访问数据库以获取数据,因此将执行 i/o。
使用该库的应用程序可能主要使用数据库,但尚不确定。
解决方案
每当有很多 IO 要做异步时,IMO 都应该使用,无论并行完成多少 CPU 密集型工作。因为如果完成了 IO-bound 工作,则可能存在可用于 UI 线程的 CPU 空闲时间,因此可能加载和显示文档模型的应用程序在加载时仍然是响应式的。
对于模型提供的方法,答案是它取决于它们所做的 IO 工作量。如果他们不做太多 IO 工作,那么就不需要异步。
推荐阅读
- javascript - 为什么删除函数没有调用在 div 中附加的单击 span 标签
- python - Keras 中的自定义损失函数(R 语言)
- angular - Angular如何检测子/嵌套路由是否返回父级
- autodesk-forge - 使用 AR/VR Toolkit 保存 Prefab 不起作用
- django - 带有 Abstractuser 的 PasswordChangeForm 在提交时没有响应
- python - 从 Tfidf Vectorizer 中仅选择前 n 个特征
- sas - SAS保留价值并分配给新变量
- ssl - 如何使用在线 WLST 脚本启用 SSL?
- javascript - 如何覆盖(覆盖)material-ui(React)中的类和样式
- tableau-api - 在画面中使用 lat long 计算距离