我在显示主窗口之前有一个带登录窗口的wpf应用程序。
我使用mef加载所有模块/部件。在主窗口开始之前,我会根据我显示的部分检查用户登录数据。部分是共享和非共享。
[ImportMany]
private IEnumerable<Lazy<IComponent, IComponentMetadata>> _components;
[ImportMany("Resourcen", typeof(ResourceDictionary))]
private IEnumerable<ResourceDictionary> _importResourcen;
var catalog = new AggregateCatalog();
catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly()));
catalog.Catalogs.Add(new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory));
_mefcontainer = new CompositionContainer(catalog);
_mefcontainer.ComposeParts(somepartwithaSharedExport, this);
这一切都很好。但现在我尝试了“重新登录”。
_mefcontainer.Dispose();
_mefcontainer = null;
//here the stuff that works from above
首先我认为它有效,但似乎我第一次创造的部分仍然存在于记忆中,我没有机会“杀死”它们。所以当我重新登录足够的时间时,我得到OutOfMemory Exception。
为什么我现在使用这种方法
System.Diagnostics.Process.Start(Application.ResourceAssembly.Location);
App.ShutDown();
我对此并不满意。
有没有办法清理Compositioncontainer并创建一个新的?
答案 0 :(得分:0)
您可以尝试拨打_mefcontainer.RemovePart(somepartwithaSharedExport)
。更多详情:http://mef.codeplex.com/wikipage?title=Parts%20Lifetime
答案 1 :(得分:0)
对于非共享部分,您可以拨打CompositionContainer.ReleaseExport:
_mefcontainer.ReleaseExport(nonSharedExport);
有关详细信息,请尝试使用此answer中的示例代码。
据我所知,如果不配置容器,则无法释放共享部件。如果您使用该路径,那么您还必须确保不保留对这些对象的引用以允许 GC 收集它们。来自mrtig的答案的文档参考提供了许多关于部件寿命的有用细节,你应该将它与weshaggard的answer一起研究到类似的问题。它还解释了一次性部件会发生什么。