gpt4 book ai didi

c# - MEF 的对象破坏问题

转载 作者:太空宇宙 更新时间:2023-11-03 17:45:55 25 4
gpt4 key购买 nike

我使用静态变量来保存对象的数量。在构造函数中,我增加了这个变量。这样我就知道创建了多少个对象实例。
使用对象后,它们将被取消引用。
我怀疑 MEF持有对这些对象的引用,所以我强制 GC进行清理(使用 GC.Collect() 方法)。我希望在下一个对象创建时这个变量从零开始,但它从最后一个数字恢复。我在 destructor 中放置了一个日志记录机制用于跟踪,对象只有在应用程序关闭后才会被销毁。
我可以假设 MEF是否创建了对这些对象的其他引用?

我用 MEFExportFactory用于创建我的对象

编辑:

也许有 ExportLifetimeContext需要被完成 ?

最佳答案

I force GC to do a clean up



如果 MEF 仍然具有对对象的引用,那么显然这不会做任何事情。如果对象已经变成垃圾,那么垃圾收集器会自动收集它们——明确要求它这样做只是一个可能被忽略的提示。无论哪种方式,这都不是必需的。

I put a logging mechanism in destructor for tracing, and objects are destroyed only after the application is closed. Can I assume MEF has created other references to those objects ?



MEF 将保存对已创建对象的引用,以便在您请求导出时能够重复返回相同的引用。要要求 MEF 放弃这些引用,您应该调用 CompositionContainer.Dispose .显然,在那之后您不能再重复使用该容器,尽管您可以创建一个新容器。

MEF 也是任何 IDisposable 的所有者它创建的对象。这意味着当您处置容器时,它将调用 Dispose在放弃引用之前在任何此类对象上。

最好依靠对 Dispose 的调用。执行清理,而不是使用终结器。 There is no guarantee that finalizers are run at all .

编辑:

I need to destroy the object after using it. But I don't want to destroy the container. I want MEF as a factory for creating new instances of asking part, and the caller should be capable of destroying the object when he doesn't need anymore. Can you help with this ?



这就是 ExportFactory是为了。 (以前称为 PartCreator )。不幸的是,它在 .NET 4 中尚不可用,除非您使用 Silverlight。您可以使用 codeplex 中的预览版已经试一试了。

如果您不想使用 MEF 的预览版,您可以实现类似 ExportFactory 的功能。自己创建包装容器的工厂类并使用它的 GetExport ReleaseExport 获取和释放对象的方法。不要忘记设置 PartCreationPolicy如果您需要创建同一零件的多个实例。

编辑2:
我不知何故错过了您已经在使用 ExportFactory一直。您只需调用ExportLifeTimeContext.Dispose当你完成对象时!

关于c# - MEF 的对象破坏问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4368217/

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