【发布时间】:2011-04-27 20:37:34
【问题描述】:
我在利用 MEF 的应用程序中收到以下错误:
目前正在撰写另一批 这个 ComposablePartExportProvider。 一次只能组成一个批次 时间。
关于如何修复此错误的信息似乎很少,并且不确定我应该提供哪些其他信息以获得一些帮助。
还有其他人使用 MEF 收到此错误吗?如果是这样,您解决问题的一些方法是什么?
【问题讨论】:
我在利用 MEF 的应用程序中收到以下错误:
目前正在撰写另一批 这个 ComposablePartExportProvider。 一次只能组成一个批次 时间。
关于如何修复此错误的信息似乎很少,并且不确定我应该提供哪些其他信息以获得一些帮助。
还有其他人使用 MEF 收到此错误吗?如果是这样,您解决问题的一些方法是什么?
【问题讨论】:
我发现,如果您尝试动态构建导出列表以匹配导入类型,container.GetExports<T>().Select(y => y.Value) 会更好。
对于container.ComposeParts(...),我必须拥有各种lock(){} 块和另一个线程来进行组合。 GetExports<> 似乎没有受此影响。
【讨论】:
在初始化组合容器时,有一个标志可以启用线程安全选项。一旦启用此功能,您就不需要任何自定义锁定机制
var c = new AggregateCatalog();
c.Catalogs.Add(new AssemblyCatalog("MyAssemblyName"));
var container = new CompositionContainer(c, true); // true means that it is thread safe
【讨论】:
可能有太多线程同时使用这个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);
}
}
}
【讨论】: