工作區檔案上下文

所有對工作區的洞察都是由實作介面的「文件上下文提供者」所產生。 這些延伸模組可能會在資料夾或檔案中尋找模式、讀取 MSBuild 檔案和 makefile、偵測套件相依性等,以累積定義檔案內容所需的深入解析。 檔案內容本身不會執行任何動作,而是提供另一個延伸模組可以執行動作的資料。

每個 FileContext 都有一個 Guid 來識別它所攜帶的資料類型。 工作區稍後會使用 Guid 來匹配透過 Context 屬性使用資料的延伸模組。 檔案上下文提供者會匯出中繼資料,以識別其可能產生資料的檔案上下文Guid

定義之後,檔案上下文可以與工作區中任何數量的檔案或資料夾相關聯。 指定的檔案或資料夾可以與任意數目的檔案內容相關聯。 這是一種多對多的關係。

檔案內容最常見的案例與建置、偵錯和語言服務有關。 如需詳細資訊,請參閱與這些案例相關的其他主題。

檔案內容生命週期

生命 FileContext 週期是不確定的。 元件可以隨時非同步請求某一組上下文類型。 將會查詢支援某些要求內容類型子集的提供者。 IWorkspace實例透過該GetFileContextsAsync方法充當消費者和提供者之間的中間人。 使用者可能會請求情境,並根據情境執行一些短期動作,而其他使用者可能會請求情境並維護長期參考資料。

檔案可能會發生變更,導致檔案內容過時。 提供者可以在FileContext上引發事件,以通知使用者更新。 例如,如果為某些檔案提供建置內容,但磁碟上的變更使該內容失效,則原始生產者可以叫用事件。 任何仍在參考該 FileContext 的消費者,然後可以重新查詢新的 FileContext

備註

沒有針對消費者的推送模式。 消費者在提出請求後不會收到供應商的新 FileContext 通知。

昂貴的檔案上下文計算

從磁碟讀取檔案內容可能會很昂貴,尤其是當提供者需要解析檔案之間的關聯性時。 例如,可能會查詢提供者關於某些來源檔案的檔案內容,但該檔案內容依賴於專案檔案的中繼資料。 剖析專案檔案或使用 MSBuild 評估專案檔案的成本很高。 相反地,擴充套件可以匯出一個IFileScanner以在工作區索引期間建立FileDataValue資料。 現在,當要求檔案內容架構時,系統可以快速查詢該索引資料。 如需索引的詳細資訊,請參閱 工作區索引主題

警告

請謹慎對待 FileContext 其他計算成本高昂的方式。 某些 UI 互動是同步的,並且依賴大量 FileContext 請求。 範例包括開啟編輯器索引標籤,以及開啟 方案總管 操作功能表。 這些動作會提出許多建置環境定義類型要求。

檔案情境動作

雖然 a FileContext 本身只是有關某些文件的數據,但 an IFileContextAction 是一種表達和處理該數據的方法。 IFileContextAction 的使用非常靈活。 最常見的兩種情況是構建和調試。

報告進度

ExecuteAsync 方法傳遞了 IProgress<IFileContextActionProgressUpdate>,但不應將引數用作該類型。 IFileContextActionProgressUpdate 是一個空介面,IProgress<IFileContextActionProgressUpdate>.Report(IFileContextActionProgressUpdate) 可能會擲出 NotImplementedException。 相反地,IFileContextAction 必須根據情況將引數轉換為另一種類型。

如需 Visual Studio 所提供類型的相關資訊,請參閱各場景的文件。

檔案監看

工作區會接收檔案變更通知,並透過 IFileWatcherServiceGetFileWatcherService 提供。 符合 “ExcludedItems” 設定的檔案不會產生檔案通知事件。 事件之間的臨界值用於簡化通知和減少重複。 當您需要對檔案變更做出反應時,您應該訂閱此服務。

小提示

工作區的 索引服務 預設會訂閱檔案事件。 檔案的新增和修改會觸發與該檔案新資料相關的 IFileScanner 事件。 檔案刪除將刪除索引資料。 您不需要將 IFileScanner 訂閱到檔案監視服務。

  • 索引編製 - 工作區索引會收集並保存工作區的相關信息。
  • 工作區 - 檢閱工作區概念和設定儲存體。