我已经创建了一个定制的WPF用户控件,打算由第三方使用.我的控件有一个可丢弃的私有成员,我希望确保在包含窗口/应用程序关闭后始终调用其dispose方法.然而,UserControl不是一次性的.

我try 实现IDisposable接口并订阅卸载的事件,但在主机应用程序关闭时两者都没有被调用.MSDN表示,卸载的事件可能根本不会引发.它也可能会被多次触发,也就是当用户更改主题时.

如果可能的话,我不想依赖我控制的消费者记住调用特定的Dispose方法.

 public partial class MyWpfControl : UserControl
 {
     SomeDisposableObject x;

     // where does this code go?
     void Somewhere() 
     {
         if (x != null)
         {
             x.Dispose();
             x = null;
         }

     }
 }

到目前为止,我找到的唯一解决方案是订阅Dispatcher的ShutdowStart事件.这是合理的做法吗?

this.Dispatcher.ShutdownStarted += Dispatcher_ShutdownStarted;

推荐答案

有趣的博客帖子在这里:Dispose of a WPF UserControl (ish)

它提到了订阅Dispatcher.ShutdownStarted来处置你的资源.

.net相关问答推荐

从Couchbase删除_txn文档的推荐方法?""

如何使用.NET8MapIdentityApi设置OpenApi操作ID

从删除项目时重新索引的列表中删除项目的最佳算法是什么?

查找 2 个已知值之间的字符串

编译时禁用 Dll 文化文件夹

从 switch 块中跳出 foreach 循环

我可以从 .NET/C# 获取其他进程的命令行参数吗?

注册 COM 互操作与使程序集 COM 可见

.NET 等价于旧的 vb left(string, length) 函数

如何通过 LINQ 比较没有时间的 DateTime?

如何在 C# 中将 HTML 转换为文本?

[DllImport("QCall")] 是什么?

为什么 Interlocked.Exchange 不支持布尔类型?

覆盖方法上的 C# 可选参数

寻找 .NET 的命令行参数解析器

.NET 中是否有可序列化的通用键/值对类?

使用+运算符的字符串连接

如何使用通用扩展方法中的字符串列名在 IQueryable 上应用 OrderBy?

根据条件从列表中删除项目

如何为我的 C# 应用程序创建产品密钥?