繁体   English   中英

MEF重组-是否保留现有实例?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM