【发布时间】:2010-10-04 21:41:29
【问题描述】:
我创建了一个供第三方使用的自定义 WPF 用户控件。我的控件有一个一次性的私有成员,我想确保一旦包含的窗口/应用程序关闭,它的 dispose 方法将始终被调用。但是,UserControl 不是一次性的。
我尝试实现 IDisposable 接口并订阅 Unloaded 事件,但在主机应用程序关闭时都没有被调用。 MSDN 说可能根本不会引发 Unloaded 事件。也可能不止一次触发,即用户更换主题时。
如果可能的话,我不想依赖我控制的消费者记住调用特定的 Dispose 方法。
public partial class MyWpfControl : UserControl
{
SomeDisposableObject x;
// where does this code go?
void Somewhere()
{
if (x != null)
{
x.Dispose();
x = null;
}
}
}
到目前为止,我发现的唯一解决方案是订阅 Dispatcher 的 ShutdownStarted 事件。这是一个合理的方法吗?
this.Dispatcher.ShutdownStarted += Dispatcher_ShutdownStarted;
【问题讨论】:
-
虽然您可以在您的用户控件上实现 IDisposable 接口,但不能保证您的第三方会调用您的 Dispose 模式实现的 dispose 方法。如果你持有原生资源(例如文件流),你应该考虑使用终结器。
标签: c# .net wpf user-controls dispose