gpt4 book ai didi

c# - 在 ViewModel 中取消 Hook 事件处理程序的正确方法是什么

转载 作者:行者123 更新时间:2023-12-03 10:35:14 24 4
gpt4 key购买 nike

因此,我一直在研究如何从我的 View 模型中正确取消事件处理程序,以防止内存泄漏。

假设我有一个 查看型号 像这样:

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;
}
}

但是当我想到时,这并没有被调用。它似乎是不稳定的,有时甚至根本没有打电话?所以我决定搜索“何时调用 dispose”,这导致我找到 this link解释 DisposeFinaliser 调用/ Destructor
引导我进行最后一项研究的原因是,我记得有人说不要在 Destructor 中取消 Hook 事件处理程序。因为它永远不会被调用,来自 this link .

所以我只是想最后澄清一下。在 ViewModel 中解开事件处理程序的正确方法是什么?

最佳答案

我通常在导航期间在我的 View 模型上取消注册事件处理程序。

例如,当引发 OnNavigatedFrom 事件(在您的 View 上)时,您可以取消注册当前 View 模型上的事件处理程序。然后,当引发 OnNavigatedTo 事件时,您可以重新注册事件处理程序。

关于 IDisposable,我不确定。
我认为 IDisposable 是用于管理资源而不是业务逻辑。

关于c# - 在 ViewModel 中取消 Hook 事件处理程序的正确方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33505291/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com