工作区文件上下文

“打开文件夹 ”工作区的所有见解都由实现接口的 IFileContextProvider “文件上下文提供程序”生成。 这些扩展可能查找文件夹或文件中的模式、读取 MSBuild 文件和生成文件、检测包依赖项等,以便累积定义文件上下文所需的见解。 文件上下文本身不会执行任何操作,而是提供另一个扩展可以处理的数据。

每个 FileContext 属性都有一个 Guid 关联,用于标识它携带的数据类型。 工作区稍后会使用它 Guid 来将其与通过 Context 属性使用数据的扩展匹配。 文件上下文提供程序使用元数据导出,用于标识它可能为其生成数据的文件上下文 Guid

定义后,文件上下文可以与工作区中任意数量的文件或文件夹相关联。 给定的文件或文件夹可能与任意数量的文件上下文相关联。 这是一段多对多的关系。

文件上下文的最常见方案与生成、调试和语言服务相关。 有关详细信息,请参阅与这些方案相关的其他主题。

文件上下文生命周期

生命周期是不确定的 FileContext 。 随时,组件可以异步请求某些上下文类型集。 将查询支持某些请求上下文类型的子集的提供程序。 该 IWorkspace 实例通过 GetFileContextsAsync 该方法充当使用者和提供程序之间的中间人。 使用者可能会请求上下文并基于上下文执行一些短期操作,而另一些使用者可能请求上下文并维护长期引用。

更改可能会发生导致文件上下文过时的文件。 提供程序可以在事件上 FileContext 触发事件,以通知使用者更新。 例如,如果为某些文件提供了生成上下文,但磁盘上的更改使该上下文失效,则原始生成者可以调用该事件。 任何使用者仍引用, FileContext 然后可以重新查询新的 FileContext

注意

没有向使用者推送模型。 使用者在请求后不会收到提供商的新 FileContext 通知。

昂贵的文件上下文计算

从磁盘读取文件内容可能很昂贵,尤其是在提供程序需要解决文件之间的关系时。 例如,可以查询某个源文件的文件上下文的提供程序,但文件上下文依赖于项目文件中的元数据。 使用 MSBuild 分析项目文件或对其进行评估非常昂贵。 扩展可以导出在 IFileScanner 工作区索引期间创建 FileDataValue 数据。 现在,当请求文件上下文时, IFileContextProvider 可以快速查询该索引数据。 有关索引的详细信息,请参阅 工作区索引 主题。

警告

请谨慎对待其他计算成本高昂的方法 FileContext 。 某些 UI 交互是同步的,依赖于大量 FileContext 请求。 示例包括打开编辑器选项卡和打开解决方案资源管理器上下文菜单。 这些操作发出许多生成上下文类型请求。

文件上下文操作

虽然本身 FileContext 只是有关某些文件的数据,但 IFileContextAction 这是表达和处理该数据的方法。 IFileContextAction 其用法十分灵活。 其中两种最常见的情况是生成和调试。

报告进度

该方法 ExecuteAsync 传递 IProgress<IFileContextActionProgressUpdate>,但参数不应用作该类型。 IFileContextActionProgressUpdate 是一个空接口,并且调用 IProgress<IFileContextActionProgressUpdate>.Report(IFileContextActionProgressUpdate) 可能会引发 NotImplementedException。 相反, IFileContextAction 必须根据需要将参数强制转换为另一种类型。

有关 Visual Studio 提供的类型的信息,请参阅相应的方案文档。

文件监视

工作区侦听文件更改通知并提供 IFileWatcherService 通过 GetFileWatcherService。 与“ExcludedItems”设置匹配的文件不会生成文件通知事件。 事件之间的阈值用于通知简化和重复减少。 需要对文件更改做出反应时,应订阅此服务。

提示

默认情况下,工作区的 索引服务 订阅文件事件。 文件添加和修改将导致为该文件的新数据调用相关的 IFileScanner事件。 文件删除将删除索引数据。 无需订阅 IFileScanner 文件观察程序服务。

  • 索引 - 工作区索引收集并保留有关工作区的信息。
  • 工作区 - 查看工作区概念和设置存储。