什么是在ViewModel中解绑事件处理程序的正确方法
什么是在ViewModel中解绑事件处理程序的正确方法
我一直在研究如何正确地解除与视图模型相关的事件处理程序,以防止内存泄漏。\n假设我有一个如下所示的视图模型:\n
class MyViewModel { private List_myObjects; public List 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) { //做一些事情 } }
\n最初我找到了这个链接,其中说明了要实现`IDisposable`接口并添加一个`Dispose`方法:\n
public void Dispose() { foreach (var obj in MyObjects) { obj.MySampleEvent -= Obj_MySampleEvent; } }
\n但是当我期望调用它时,并不总是被调用。它似乎不稳定,有时甚至根本不会被调用?所以我决定搜索“何时调用Dispose”,这导致我找到了这个链接,解释说`Dispose`方法由`Finaliser`/`析构函数`调用。\n这引导我进行最后一项研究,即我记得有人说不要在`析构函数`中解除事件处理程序,因为它永远不会被调用,来自这个链接。\n所以我想最终澄清一下...在视图模型中解除事件处理程序的正确方法是什么?