MEF对象销毁问题我用静态变量来保存对象个数。在构造函数中,我增加了这个变量。这样我就知道创建了多少个对象实例。使用这些对象后,它们将被解除引用。我怀疑MEF持有对这些对象的引用,因此我强制GC进行清理(使用GC.Collect()方法)。我希望在下一个对象创建时,这个变量从零开始,但它从最后一个数字重新开始。我在析构函数中放置了一个日志记录机制以用于跟踪目的,并且该对象仅在应用程序关闭后才被销毁。我可以假设MEF已经创建了对这些对象的其他引用吗?我使用MEF和ExportFactory来创建我的对象编辑:也许应该用ExportLifetimeContext做些什么?我正在强制GC进行清理。如果MEF仍然引用该对象,那么显然这没有做任何事情。如果对象变成了垃圾,那么垃圾收集器将自动收集它们——明确要求它这样做只是一个可能被忽略的提示。无论哪种方式,都没有必要。我在析构函数中放置了一个日志记录机制以用于跟踪目的,并且该对象仅在应用程序关闭后才被销毁。我可以假设MEF已经创建了对这些对象的其他引用吗?MEF将保留对已创建对象的引用,以便在您请求导出时可以重复返回相同的引用。要让MEF丢弃这些引用,您应该调用CompositionContainer.Dispose。显然,此后您不能再使用该容器,尽管您可以创建一个新容器。MEF也是它创建的任何IDisposable对象的所有者。这意味着当您释放容器时,它会在放弃引用之前对任何此类对象调用Dispose。依赖调用Dispose来执行清理比使用终结器更好。根本无法保证终结器会运行。编辑:我需要在使用后销毁它。但我不想破坏容器。我希望MEF充当一个工厂来创建被询问部分的新实例,并且调用者应该能够在他不再需要该对象时销毁该对象。你能帮忙吗这就是ExportFactory的用途。(它以前称为PartCreator)。遗憾的是,除非您使用Silverlight,否则它在.NET4中尚不可用。您可以尝试使用codeplex的预览版。如果您不想使用MEF的预览版,您可以通过创建一个包装容器的工厂类并使用其GetExport和ReleaseExport方法来获取和释放对象来实现自己的GetExport。如果您需要创建同一部件的多个实例,请不要忘记设置PartCreationPolicy。编辑2:我错过了您一直在使用ExportFactory。完成对象后,您只需调用ExportLifeTimeContext.Dispose!在CLR中及时“销毁”(即终结)对象并不是一件好事。如果您这样做是出于调试目的,则没有必要。您可以按照我对这个问题的回答找出仍然存在多少特定类型的对象:C#WPF中的内存泄漏如果您真的想让软件的行为取决于GC未回收的类实例的数量,那么你需要重新考虑你的设计。有几种更好的方法可以实现您想要的。对于共享对象,只要容器处于活动状态,MEF就会保留对它们的引用。您可以在适当的时候尽早处理非共享部件。如果您使用的是ExportFactory,则需要处理由CreateExport方法返回的ExportLifetimeContext,以处理作为请求的一部分创建的任何NonShared部分。如果在容器上调用了GetExport方法,则可以调用ReleaseExport方法。如果您以其他方式(即SatisfyImports或其他方式)获取导出,则无法释放它们,因此您可能需要重构您的应用以使用ExportFactory或GetExport。MEF现在有一个支持ExportFactory的桌面版本。尽管名称中包含“导出”,但您应该在执行“导入”的地方实现它。调用CreateExport()方法创建部件的新实例将返回一个ExportLifetimeContext该对象具有一个Dispose()方法,可用于稍后释放导出的对象。此方法将自动调用对象上的Dispose(),您无需手动调用它。这种行为是由于容器本身是所创建对象的所有者,即使在这些对象被引用时调用Dispose()对它们也没有影响。以上就是C#学习教程:MEF的对象销毁问题的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
