我正在使用一个在我的WPF自定义控件中实现IDisposable的对象。当控件是GC时,如何确保放置此对象?在Control类中没有Dispose()或任何方法可以覆盖以处置我的对象。
答案 0 :(得分:1)
我认为如果你遵循MVVM设计模式,那么资源应该保存在模型或视图模型中。
另外,弱事件模式应该用于附加事件。
答案 1 :(得分:0)
如果尚未调用终结器,则应调用Dispose
。如果您正在处理.NET类型,那么您可以放心,它会。当对象是GC并且你没问题时,终结器将被调用。
这对于显示Bitmap
的Picturebox等控件来说很常见。除非你经常更换Bitmap(在这种情况下你应该处理它),你可能会过去而不会过于谨慎。
那就是说,它取决于你的应用程序及其运作方式。如果你有很多实现不再需要的IDisposable的对象,但是可能有相当长时间的实时引用,那么你应该更积极主动并创建一个方案来确保这些事情被确定性地清理为可能。
答案 2 :(得分:0)
如果您正在使用需要处理的对象,请尝试使用Application.Shutdown方法在关闭时释放资源,或者在删除控件时尝试Unloaded事件释放资源来自视觉树。您可能需要使用这两种方法的组合。
尝试查看this问题,看看是否有帮助
答案 3 :(得分:0)
我在WPF UserControl中添加了BackgroundWorker的一个实例。这可能是也可能不是一个好主意,但无论如何。每个UserControl只需要运行一个BackgroundWorker实例。因此,我将BackgroundWorker初始化为null。当我需要使用BackgroundWorker时,我检查它是否为null,然后创建它的新实例,让它完成它的工作。然后,我将它放在worker complete事件中,并将其设置为null。
您可以使用WPF窗口关闭或卸载事件。卸载不会在UserControl上调用,但它会在包含UserControl的窗口中调用。
WPFWindow事件关闭(或卸载,或其他)调用UserControl中的自定义释放函数。此自定义发布功能可以完成工作。
所以,没有真正优秀的适合您问题的所有解决方案。它需要更多的设计和思想来处理需要处理的功能,因为通常,WPF不需要它。 WPF通常只要求您将项目设置为null。 (当您将UserControl设置为null时,是否会调用UserControl.Unload?之前没有考虑过它,但如果确实如此,那将是正确的答案。)