【发布时间】:2011-06-21 02:39:47
【问题描述】:
我正在使用在我的 WPF 自定义控件中实现 IDisposable 的对象。当控件被 GC'ed 时,如何确保该对象被释放?我可以覆盖 Control 类中的 Dispose() 或任何方法来处理我的对象。
【问题讨论】:
-
这取决于你如何使用这个对象。可以出示一下代码吗?
我正在使用在我的 WPF 自定义控件中实现 IDisposable 的对象。当控件被 GC'ed 时,如何确保该对象被释放?我可以覆盖 Control 类中的 Dispose() 或任何方法来处理我的对象。
【问题讨论】:
如果您正在使用需要释放的对象,请尝试在关闭时使用Application.Shutdown 方法释放资源,或者在从可视化树中移除控件时尝试使用Unloaded 事件释放资源.您可能需要结合使用这两种方法。
尝试查看this 问题,看看是否有帮助
【讨论】:
我认为如果您遵循 MVVM 设计模式,那么资源应该保存在模型或视图模型中。
另外,应该使用弱事件模式来附加事件。
【讨论】:
如果尚未调用终结器,则应调用 Dispose。如果您正在处理 .NET 类型,那么您可以放心。当对象被 GC 时,终结器将被调用,你会没事的。
这对于显示Bitmap 的Picturebox 等控件很常见。除非您经常更换该位图(在这种情况下您应该将其丢弃),否则您可能会在不过度谨慎的情况下过得去。
也就是说,这取决于您的应用及其工作方式。如果您有很多实现 IDisposable 的对象不再需要,但可能存在相对较长时间的实时引用,那么您应该更加积极主动并创建一个方案来确保这些东西像确定性一样被清理可能的。
【讨论】:
我昨晚处理了这个问题。也就是说,我需要对 UserControl 中的对象调用 dispose。我认为你有两个选择。
我向 WPF 用户控件添加了一个 BackgroundWorker 实例。这可能是一个好主意,也可能不是一个好主意,但无论如何。每个 UserControl 只需要运行一个 BackgroundWorker 实例。因此,我将 BackgroundWorker 初始化为 null。当我需要使用 BackgroundWorker 时,我会检查它是否为空,然后创建它的一个新实例,让它完成它的工作。然后,我在 worker 完成事件中处理它,并将其设置回 null。
您可以使用 WPF 窗口关闭或卸载事件。 Unload 不会在 UserControl 上调用,但会在包含该 UserControl 的 Window 中调用。
WPFWindow 事件关闭(或卸载,或其他)在您的用户控件中调用自定义释放函数。这个自定义发布函数可以完成这项工作。
因此,没有真正适合您问题的万能解决方案。它需要更多的设计和思想来处理需要处理的功能,因为通常 WPF 不需要它。 WPF 通常只要求您将项目设置为空。 (当您将 UserControl 设置为 null 时是否会调用 UserControl.Unload?之前没有考虑过,但如果确实如此,那将是正确的答案。)
【讨论】: