同时使用不同的 AdhocWorkspace 实例是否安全?
Is it safe to use different AdhocWorkspace instances concurrently?
我面临这样一种情况,我想使用 不同的实例 ( 不是 一个共享实例) Microsoft.CodeAnalysis.AdhocWorkspace
(docs) 在多个线程中并发(=> 每个线程一个单独的实例)。
在查看 AdhocWorkspace
的默认构造函数时,让我印象深刻的一件事是它总是在幕后使用静态 MefHostServices
实例:
public AdhocWorkspace() : this(Host.Mef.MefHostServices.DefaultHost)
这让我很好奇,我做了一些研究,以了解多个并发 AdhocWorkspace
是否会导致任何问题。
结果:
- 我找不到任何明确说明它是否安全的文档。
- 我发现了一些像 this and this 这样的旧 github 问题,它们在讨论并发问题。尤其是后者,听起来只要我们只使用一个主机服务就可以了(默认构造函数似乎就是这种情况),尽管我不确定这是否与我的情况相关。
- 实际上我尝试并行使用很多
AdhocWorkspace
(添加文档、项目和编译),到目前为止没有遇到任何问题。
结论: 虽然到目前为止看起来还不错,但我会对它的实际设计原理感兴趣。特别是在可能出现竞争条件的情况下,我不想依赖快速测试和一些没有明确结果的研究。
也许有人可以指点我相关的文档或代码?甚至 roslyn 团队成员也可以提供一些说明?
注意:我对 MEF 不是很熟悉,所以如果我对 MEF 知识不足,也许我自己回答这个问题会更容易。
同时使用多个工作区绝对没问题。从主机服务共享的服务应该是无状态的(因此无需担心竞争条件),或者如果它们保持状态,则可以安全地保持状态。
我面临这样一种情况,我想使用 不同的实例 ( 不是 一个共享实例) Microsoft.CodeAnalysis.AdhocWorkspace
(docs) 在多个线程中并发(=> 每个线程一个单独的实例)。
在查看 AdhocWorkspace
的默认构造函数时,让我印象深刻的一件事是它总是在幕后使用静态 MefHostServices
实例:
public AdhocWorkspace() : this(Host.Mef.MefHostServices.DefaultHost)
这让我很好奇,我做了一些研究,以了解多个并发 AdhocWorkspace
是否会导致任何问题。
结果:
- 我找不到任何明确说明它是否安全的文档。
- 我发现了一些像 this and this 这样的旧 github 问题,它们在讨论并发问题。尤其是后者,听起来只要我们只使用一个主机服务就可以了(默认构造函数似乎就是这种情况),尽管我不确定这是否与我的情况相关。
- 实际上我尝试并行使用很多
AdhocWorkspace
(添加文档、项目和编译),到目前为止没有遇到任何问题。
结论: 虽然到目前为止看起来还不错,但我会对它的实际设计原理感兴趣。特别是在可能出现竞争条件的情况下,我不想依赖快速测试和一些没有明确结果的研究。
也许有人可以指点我相关的文档或代码?甚至 roslyn 团队成员也可以提供一些说明?
注意:我对 MEF 不是很熟悉,所以如果我对 MEF 知识不足,也许我自己回答这个问题会更容易。
同时使用多个工作区绝对没问题。从主机服务共享的服务应该是无状态的(因此无需担心竞争条件),或者如果它们保持状态,则可以安全地保持状态。