【发布时间】:2016-02-03 23:16:32
【问题描述】:
所以我一直在研究如何从我的视图模型中正确解除事件处理程序以防止内存泄漏。
假设我有一个像这样的视图模型:
class MyViewModel
{
private List<MyObject> _myObjects;
public List<MyObject> MyObjects
{
get { return _myObjects; }
set { _myObjects = value; }
}
public MyViewModel()
{
for (int i = 0; i < 10; i++)
{
var obj = new MyObject();
obj.MySampleEvent += Obj_MySampleEvent ;
}
}
private void Obj_MySampleEvent (object sender, EventArgs e)
{
//do something
}
}
现在最初我找到了This link,其中说实现IDisposable 并添加Dispose 方法:
public void Dispose()
{
foreach (var obj in MyObjects)
{
obj.MySampleEvent -= Obj_MySampleEvent;
}
}
但是当我想到时,这并没有被调用。它似乎是不稳定的,有时甚至根本没有打电话?所以我决定搜索“什么时候被调用”,这导致我找到this link,解释说Dispose被Finaliser/Destructor调用
让我进行最后一项研究的原因是,我记得有人说不要在 Destructor 中取消挂钩事件处理程序,因为它永远不会被从 this link 调用。
所以我只是想最后澄清一下。在 ViewModel 中解开事件处理程序的正确方法是什么?
【问题讨论】:
-
我猜这取决于您的应用程序的架构。我的虚拟机有一个清理功能,我用它来清理它,它会在我需要时手动调用,然后我在应用程序关闭时循环遍历所有注册的视图模型并清理它们。
-
内存泄漏?您无需取消订阅。从列表中删除对象,失去
_myObject或MyViewModel引用的实例就足够了,不会导致任何内存泄漏。
标签: c# events mvvm eventhandler