我在使用一个实现了IDisposable接口的对象来创建WPF自定义控件。当控件被GC回收时,如何确保该对象被正确释放?由于Control类中没有Dispose()或其他可以覆盖以释放该对象的方法。
我认为如果您遵循MVVM设计模式,那么资源应该保存在模型或视图模型中。
此外,应使用弱事件模式来附加事件。
如果尚未调用,则终结器应调用Dispose
。如果您正在处理.NET类型,则可以确保它会这样做。当对象被GC'd时,终结器将被调用,您将没问题。
这对于像显示Bitmap
的控件(例如Picturebox)非常典型。除非您经常更换该位图(在这种情况下,您应该处理它),否则您可能可以不过分谨慎地使用它。
话虽如此,这取决于您的应用程序及其工作方式。如果您有许多实现IDisposable但不再需要的对象,并且可能有相对较长时间的活动引用,则应更加积极并创建一种方案,以尽可能确定地清除这些内容。
昨晚我处理了这个问题。也就是说,我需要在UserControl中调用一个对象的dispose方法。我认为你有两个选择。
我向WPF UserControl添加了BackgroundWorker的实例。这可能是一个好主意,也可能不是。每个UserControl只需要运行一个BackgroundWorker实例。因此,我将BackgroundWorker初始化为null。当我需要使用BackgroundWorker时,我检查它是否为null,然后创建一个新的实例,让它完成工作。然后,在worker完成事件中对其进行处理,并将其设置回null。
您可以使用WPF Window关闭或卸载事件。Unload不会在UserControl上调用,但在包含该UserControl的Window中会调用。
WPFWindow事件Close(或Unload或其他)调用您的UserControl中的自定义释放函数。这个自定义释放函数会完成工作。
所以,对于你的问题,没有一个真正好的通用解决方案。需要更多的设计和思考来处理需要dispose的功能,因为一般情况下,WPF不需要dispose。通常只需要将项目设置为null即可。(当你将UserControl设置为null时,UserControl.Unload是否会被调用?我之前没有考虑过,但如果是,那就是正确的答案。)