假设我有这样的MEF成分:
public class Composition
{
[ImportMany(AllowRecomposition = true)]
IEnumerable<ILongRunningProcess> Processes { get; set; }
public static void Main(string[] args)
{
var composition = new Composition();
using (var catalog = new DirectoryCatalog("."))
{
using (var container = new CompositionContainer(catalog)
{
container.SatisfyImportsOnce(composition);
//Fire off long running processes in response to stimuli
}
}
}
}
根据我见过的文档,我“在使用重构时必须考虑线程安全性。”[MSDN]
显然,对于我删除类型的情况,我需要确保我的长期运行过程可以安全地进行垃圾收集。但是对于在重构之前存在并且在重构后仍然存在的类型,每当重构时,我是否会为Processes
的内容返回新实例,或者当重构目录时MEF是否能够保留现有的导入实例?
基于上述文章的建议,对于ICollection<T>
MEF将使用Clear()
和Add(T)
方法,我没有希望,但我想知道我之前的确定去写同步代码。
编辑我刚才意识到我不能在静态方法中使用this
;我相应地更新了代码:)
答案 0 :(得分:0)
除非将ILongRunningProcess
导出的类型的零件创建策略设置为NonShared,否则您将获得相同的实例。
但这并不是一个线程安全问题。您确实希望确保在重构时,没有任何东西正在访问MEF容器(其中包括访问MEF提供的Lazy的Value属性等内容)。因此,如果长时间运行的进程在另一个线程上运行并且它有自己的导入,则可能会出现线程问题。