【问题标题】:MEF Recomposition - Does it preserve existing instances?MEF 重组 - 它是否保留现有实例?
【发布时间】:2010-07-06 18:13:44
【问题描述】:

假设我有这样的 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&lt;T&gt;,MEF 将使用Clear()Add(T) 方法,我不抱希望,但在编写同步代码之前我想确定一下。

编辑 我刚刚意识到我不能在静态方法中使用this;我已经相应地更新了代码:)

【问题讨论】:

    标签: c# mef


    【解决方案1】:

    除非带有 ILongRunningProcess 导出的类型将部件创建策略设置为 NonShared,否则您将获得相同的实例。

    不过,这并不是真正的线程安全问题。您确实希望确保在发生重组时,没有任何东西正在访问 MEF 容器(其中包括访问 MEF 提供的 Lazy 的 Value 属性之类的东西)。因此,如果您长时间运行的进程在不同的线程上运行并且它有自己的导入,那么您可能会遇到线程问题。

    【讨论】:

    • 我对“线程安全”一词的含义是我想确保我有办法确定性地停止这些进程,以便下一个实例可以恢复它们的处理。当目录更改时,可能有任意数量的它们在运行,并且它们的工作需要“可恢复”。我想这不符合经典定义。我会尽量想出一个更好的问题标题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-24
    • 1970-01-01
    相关资源
    最近更新 更多