【问题标题】:How to resolve the error "Currently composing another batch in this ComposablePartExportProvider. Only one batch can be composed at a time."如何解决错误“当前正在此 ComposablePartExportProvider 中组合另一个批次。一次只能组合一个批次。”
【发布时间】:2011-04-27 20:37:34
【问题描述】:

我在利用 MEF 的应用程序中收到以下错误:

目前正在撰写另一批 这个 ComposablePartExportProvider。 一次只能组成一个批次 时间。

关于如何修复此错误的信息似乎很少,并且不确定我应该提供哪些其他信息以获得一些帮助。

还有其他人使用 MEF 收到此错误吗?如果是这样,您解决问题的一些方法是什么?

【问题讨论】:

    标签: .net mef


    【解决方案1】:

    我发现,如果您尝试动态构建导出列表以匹配导入类型,container.GetExports<T>().Select(y => y.Value) 会更好。

    对于container.ComposeParts(...),我必须拥有各种lock(){} 块和另一个线程来进行组合。 GetExports<> 似乎没有受此影响。

    【讨论】:

      【解决方案2】:

      在初始化组合容器时,有一个标志可以启用线程安全选项。一旦启用此功能,您就不需要任何自定义锁定机制

      var c = new AggregateCatalog();
      c.Catalogs.Add(new AssemblyCatalog("MyAssemblyName"));
      var container = new CompositionContainer(c, true); // true means that it is thread safe
      

      【讨论】:

        【解决方案3】:

        可能有太多线程同时使用这个ComposeParts函数,我刚刚锁定了这个函数,线程可以同步操作这个函数,运行良好。

        class AAA{
        private  static object obj=new object();
        private CompositionContainer container ;
        private void MefOpt()
        {
            var c = new AggregateCatalog();
            c.Catalogs.Add(new AssemblyCatalog("MyAssemblyName"));
            container = new CompositionContainer(c, true);
            }
          private void CompPrt()
        {
          lock(obj)
        {
            container.ComposeParts(this);
        }
        }
        

        }

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-11-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-08
          相关资源
          最近更新 更多