对CompositionContainer.GetExportedValueOrDefault的第一次调用需要35秒以上

时间:2014-06-16 21:54:16

标签: .net mef

我试图了解使用MEF时我们做错了什么。

以下是我们初始化容器的方法:

var files = Directory.GetFiles(bin, "*.dll").Where(file => !Excluded.Contains(Path.GetFileName(file))).ToArray();
var filesexe = Directory.GetFiles(bin, "*.exe").Where(file => !Excluded.Contains(Path.GetFileName(file))).ToArray();
var catalog = new AggregateCatalog( files.Concat(filesexe).Select(file => new AssemblyCatalog(file)));
m_container = new CompositionContainer(catalog, true);

鉴于该容器,我们调用GetExportedValueOrDefaultGetExportedValue来实际解析根级依赖关系。虽然通常会通过导入构造函数或属性自动解析它们。

应用程序在一开始就调用GetExportedValueOrDefault方法来执行某些关键验证,否则必须立即中止应用程序。

我们的问题是,对GetExportedValueOrDefault方法的第一次调用现在大约需要35秒。

我们正在使用.NET 4.5附带的标准MEF。应用程序非常庞大,并且通过MEF注入了很多类,但是花费35秒似乎不合逻辑。

此延迟可能逐渐增加,但现在它大于启动Windows服务的服务控制管理器超时。所以我们增加了超时,但这不是我们正在寻找的解决方案。

此时迁移到Microsoft.Composition(又名MEF-2)是不可行的。

使用RedGate的ANTS分析器进行分析可以得到: enter image description here

除了有一些疯狂的反思之外,什么都没给我任何东西。我不明白如何继续前进。我该如何排除故障?

有什么想法吗?

0 个答案:

没有答案