[英]MEF Recomposition - Does it preserve existing instances?
假设我有这样一个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
; 我已经相应地更新了代码:)
除非将其上带有ILongRunningProcess
导出的类型的零件创建策略设置为NonShared,否则您将获得相同的实例。
但是,这实际上不是线程安全问题。 您确实要确保在发生重组时,没有任何东西在访问MEF容器(包括访问由MEF提供的Lazy的Value属性之类的事情)。 因此,如果长时间运行的进程在不同的线程上运行并且具有自己的导入,则可能会出现线程问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.