【问题标题】:Disposing object in wpf control在 wpf 控件中处理对象
【发布时间】:2011-06-21 02:39:47
【问题描述】:

我正在使用在我的 WPF 自定义控件中实现 IDisposable 的对象。当控件被 GC'ed 时,如何确保该对象被释放?我可以覆盖 Control 类中的 Dispose() 或任何方法来处理我的对象。

【问题讨论】:

  • 这取决于你如何使用这个对象。可以出示一下代码吗?

标签: wpf dispose


【解决方案1】:

如果您正在使用需要释放的对象,请尝试在关闭时使用Application.Shutdown 方法释放资源,或者在从可视化树中移除控件时尝试使用Unloaded 事件释放资源.您可能需要结合使用这两种方法。

尝试查看this 问题,看看是否有帮助

【讨论】:

  • 这个问题并没有真正解决问题。这不是答案。当操作系统无论如何都会重新捕获内存时,为什么在 Application.Shutdown 调用 dispose?如果用户正在关闭应用程序,那么内存泄漏不再是问题,因为他们不再使用该应用程序。 Windows.Close() 不会调用 Unloaded。它看起来更像是一个随机函数而不是其他任何东西。 Best 可能会创建自己的 Unloaded 方法,并在 Window.Close() 上调用它,尽管它可能会出现很多问题。
【解决方案2】:

我认为如果您遵循 MVVM 设计模式,那么资源应该保存在模型或视图模型中。

另外,应该使用弱事件模式来附加事件。

【讨论】:

    【解决方案3】:

    如果尚未调用终结器,则应调用 Dispose。如果您正在处理 .NET 类型,那么您可以放心。当对象被 GC 时,终结器将被调用,你会没事的。

    这对于显示Bitmap 的Picturebox 等控件很常见。除非您经常更换该位图(在这种情况下您应该将其丢弃),否则您可能会在不过度谨慎的情况下过得去。

    也就是说,这取决于您的应用及其工作方式。如果您有很多实现 IDisposable 的对象不再需要,但可能存在相对较长时间的实时引用,那么您应该更加积极主动并创建一个方案来确保这些东西像确定性一样被清理可能的。

    【讨论】:

    • 问题是WPF控件没有Dispose方法。
    • @user775602:对,因为他们不需要它,那为什么会有问题呢?
    • 问题是他正在向他的 WPF UserControl 添加一个非 WPF 项目。例如,他可以在他的 WPF UserControl 中声明一个 BackgroundWorker。 UserControl 不需要 dispose,但 BackgroundWorker 需要。他什么时候应该这么叫?我写了一个答案。
    • @Michael:嗯,他应该叫它......我想当他需要的时候。鉴于问题中的信息,这是不可能回答的。由于他编写了用户控件,因此在某些时候调用 Dispose 或在 Unloaded 事件中执行它应该足够简单(当然假设这是安全的事情)。
    • 问题是,未调用 Unloaded 事件。这必须是最常见的 WPF 问题之一,一旦您意识到问题,这是一个非常好的问题。而且,这个问题遍布整个网站,我认为我的答案是最好的。这是同一问题的另一个示例:stackoverflow.com/questions/1499477/…
    【解决方案4】:

    我昨晚处理了这个问题。也就是说,我需要对 UserControl 中的对象调用 dispose。我认为你有两个选择。

    我向 WPF 用户控件添加了一个 BackgroundWorker 实例。这可能是一个好主意,也可能不是一个好主意,但无论如何。每个 UserControl 只需要运行一个 BackgroundWorker 实例。因此,我将 BackgroundWorker 初始化为 null。当我需要使用 BackgroundWorker 时,我会检查它是否为空,然后创建它的一个新实例,让它完成它的工作。然后,我在 worker 完成事件中处理它,并将其设置回 null。

    您可以使用 WPF 窗口关闭或卸载事件。 Unload 不会在 UserControl 上调用,但会在包含该 UserControl 的 Window 中调用。

    WPFWindow 事件关闭(或卸载,或其他)在您的用户控件中调用自定义释放函数。这个自定义发布函数可以完成这项工作。

    因此,没有真正适合您问题的万能解决方案。它需要更多的设计和思想来处理需要处理的功能,因为通常 WPF 不需要它。 WPF 通常只要求您将项目设置为空。 (当您将 UserControl 设置为 null 时是否会调用 UserControl.Unload?之前没有考虑过,但如果确实如此,那将是正确的答案。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-26
      • 2013-06-30
      • 2010-10-04
      • 1970-01-01
      • 1970-01-01
      • 2012-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多