gpt4 book ai didi

.net - MEF 保留 NonShared IDisposable 部分的引用,不允许 GC 收集它们

转载 作者:行者123 更新时间:2023-12-02 07:30:59 25 4
gpt4 key购买 nike

我在 MEF 的部件生命周期中遇到了一些问题,导致我的 Prism 应用程序中出现内存泄漏。

我的应用程序导出 View 和 View 模型,并将 PartCreationPolicy 设置为 CreationPolicy.NonShared。 View 和 View 模型分别继承自ViewBaseViewModelBase,它们实现了IDisposable

现在,由于我的部件实现了IDisposable,因此容器保留了对它们的引用,这导致它们不会被垃圾收集器释放。根据MEF documentation on part lifetime ,这是设计使然:

The container will not hold references to parts it creates unless one of the following is true:

  • The part is marked as Shared
  • The part implements IDisposable
  • One or more imports is configured to allow recomposition

那么如何才能让 MEF 不保留对这些部分的引用呢?是否有一个属性可以让 MEF 知道我不希望它保留对我的部件的引用,即使它实现了 IDisposable

上面文章中讨论的两种策略对我来说似乎都不是好的解决方案:

  • ReleaseExport 需要一个 Export 对象作为参数,但我不知道如何提供该对象。我有我的 View 的实例,但我无法知道用于创建 View 的契约(Contract)是什么。如果 ReleaseExport 有一个重载,可以接收容器创建的任何对象,那就太好了。
  • 使用子容器似乎也不是一个自然的选择。

任何帮助将不胜感激。

最佳答案

除非 Prism 支持 View 对象的某种生命周期,否则除了删除 IDisposable 之外,没有其他解决方案。来自 View 公开的接口(interface)列表。

MEF 有三种方法来处理这个问题,其他响应者都提到了:

  • ExportFactory<T>
  • 子容器
  • ReleaseExport()

所有这些都需要对请求原始导出的代码部分进行一些处理 - 在本例中是 Prism 中的代码。这是有道理的,因为使用对象的代码必须知道它是如何以及何时创建的,这是不希望的。

没有ReleaseExportedObject()在 MEF 中,因为多个(例如属性)导出可以返回相同的值;逻辑上可能可以提供,但增加的复杂性使得 MEF 在可预见的 future 不太可能解决这个问题。

希望这有帮助;我已将这个问题重新标记为“Prism”,因为我确信 Prism 社区中的其他人也会遇到此问题并能够提供建议。

关于.net - MEF 保留 NonShared IDisposable 部分的引用,不允许 GC 收集它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8787982/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com