【问题标题】:WPF control containing an IDisposable member包含 IDisposable 成员的 WPF 控件
【发布时间】:2010-09-10 14:53:19
【问题描述】:

我在 WPF 代码后面有一个成员是一次性的(意味着它实现了 IDisposable 接口)

我没有看到任何可以从 WPF 中的 UserControl 覆盖的 Dispose 方法,因此我可以在我的 wpf 用户控件中处理该成员

在 WPF 用户控件中处理成员的正确方法是什么?

这是一个封装了实现 IDisposable 接口的私有成员的用户控件。因此,我需要在某个地方处理该成员。在传统的 winform 中,用户控件有一个可以覆盖的 Dispose 方法,因此在覆盖中我可以处理私有成员。但是在 WPF 用户控件中,没有这样的东西。所以我想知道在哪里可以处理 wpf 用户控件中的私有成员。

我的问题不是关于处置用户控件,而是在哪里处置其实现 IDisposable 接口的私有成员之一

【问题讨论】:

  • 你真的需要调用Dispose()吗?这是您自己的 WPF 控件吗?它是否包装了需要清理的非托管代码?或者它是否使用了大量内存,因此需要您使用 Dispose() 来强制 GC 尽快清理?我还没有在我的任何 UserControl 上调用 Dispose(),并且(还)没有看到任何内存泄漏。您能在此处提供有关 UserControl 的更多信息吗?
  • 在下面查看我的更新答案——它可能为您解决问题,因此您不必添加 Unloaded 事件处理程序。

标签: c# .net wpf


【解决方案1】:

您可以使用 UserControl 的 Unloaded 事件来进行资源清理。

【讨论】:

  • 这是标准的做法吗?
  • 标准方法是通过 MVVM/MVP 模式等消除背后的代码,并在更高级别上处理 Disposing。
  • 那行不通。来自 MSDN 文档:请注意,在应用程序开始关闭后不会引发 Unloaded 事件。当 ShutdownMode 属性定义的条件发生时,应用程序关闭。如果将清理代码放置在 Unloaded 事件的处理程序中,例如 Window 或 UserControl,它可能不会按预期调用。
  • +1 表示 Unloaded 在这里不太可能有帮助。我一直在解决一些遗留代码中的类似问题,其中 UserControl 在代码隐藏中分配了一堆东西,但是当控件消失时没有机会自行清理。当元素只是从可视树中删除而不是永久关闭时,您不太可能打算进行此类清理。 +1 也是这里的正确答案,即首先不在 View 中进行这些分配,而是在 ViewModel 中进行。不用说我的遗留代码不是特别 MVVM!
  • 这不是真的。如果您需要清理非托管资源,您应该在正确实现 IDisposable 模式的同时实现终结器。处置主要用于在确定的时间释放资源,而不是绝对确保您不会泄漏非托管的东西。这种情况只是关于在 UserControl '死亡'时处理私有成员。
【解决方案2】:

您可以在 Dispatcher.ShutDownStarted 事件处理程序中执行此操作。有关详细信息,请参阅this question(这又是指this blog post)。

【讨论】:

    【解决方案3】:

    更新

    当您调用实现 IDisposable 的私有成员时,您可以使用 using 吗?这样,它就会自动处理掉。我没有亲自在 UserControl 中这样做过,但它可能会奏效。例如

    using( MyPrivateDisposable mpd = new MyPrivateDisposable) {
        mpd.MethodA();
    }
    

    旧答案

    如果你不能调用 Dispose(),问题是你的 UserControl 没有从 Disposable() 继承。 UserControl 本身不是从它派生的,因此您必须显式地使您的 WPF 控件继承自它,即

    public class MyControl : UserControl, IDisposable {...}
    

    在此处查看 UserControl 基本类型:

    一旦你实现了 IDisposable,你就可以调用它。但是正如我在对您的问题的评论中所写的那样,我认为您需要发布有关该课程的更多信息。问问自己是否真的需要调用 Dispose() ......即您的 UserControl 访问句柄,还是使用非托管代码?如果没有,我不明白为什么你必须调用 Dispose() 除非你真的希望 GC 清理它。

    【讨论】:

    • 我知道 wpf 中的 usercontrol 没有实现 IDisposable。但我的问题不是关于处理用户控件 ....
    • 好的,看来您再次编辑了您的问题,谢谢,我看到您确实实现了 IDisposable。
    • @pdiddy 好的,现在我明白你在问什么了。
    • 感谢您的回答。但就我而言,我不想使用 using 出于不同的原因。所以我确实需要保留一个私人成员并在以后处理它......
    • okie,没问题。只要您有一个有效的解决方案来解决您的问题,这一切都很好。 :)
    猜你喜欢
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多