簡體   English   中英

並發修改Roslyn工作區? Visual Studio如何做到這一點?

[英]Concurrency of modifying a Roslyn workspace? How does Visual studio do it?

可能是一個愚蠢的問題,但是:有沒有辦法可靠地將更改同時應用於Roslyn工作區? 如果沒有,確保最佳順序​​的最佳實踐是什么?

示例:假設您已將一些解決方案加載到工作區中,並且具有將向該解決方案添加新項目的基本功能:

private Workspace _workspace;

// This is not thread-safe, right?
void AddProject()
{
  var project = _workspace.CurrentSolution.AddProject(/* ... */);
  _workspace.TryApplyChanges(project.Solution);
}

第一個問題:如果錯了,請糾正我,但是我認為AddProject不會是線程安全的,對嗎?

例如,假設您要同時添加到新項目中。 因此,您同時調用兩次AddProject()。

我的理解是存在競爭狀況,您可能最終會添加兩個項目(如果其中一個調用在另一個調用到達_workspace.CurrentSolution之前完成了TryApplyChanges),或者僅添加了一個項目(如果兩個調用都已達到_worksapce) .CurrentSolution之前已執行TryApplyChanges)。

第二個問題:如果我的理解是正確的,那么有什么最佳方法來避免這些並發問題? 我想唯一的真實方法是依次安排/執行每個修改,對嗎?

例如,Visual Studio是如何做到的。對工作區的修改是否僅在分派器上完成?

謝謝

基礎代碼是線程安全的,但您的用法不是。

如果同時更改解決方案,則TryApplyChanges()將返回false。 如果發生這種情況,您需要再次嘗試更改(從新的CurrentSolution )。

基本上,你需要寫

Solution changed;
do {
  changed = _workspace.CurrentSolution....();
} while (!_workspace.TryApplyChanges(changed);

這稱為比較交換循環; 有關更多詳細信息,請參見我的博客

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM