事件处理程序的垃圾回收

3

我有一个Windows.Forms应用程序,其中包含一个填充了帐户对象的ListBox。当用户从列表中选择一个帐户时,我会附加一个事件处理程序,负责在用户查看期间有任何新事务时更新所选帐户的交易。

private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    var selected = listBox1.SelectedItem as Account;
    if (selected != null)
    {
        UpdateTransactions(selected);
        selected.OnNewTransaction += (s, a) => UpdateTransactions(selected);
    }
}

那么我的问题如下:当用户从列表中选择另一个账户并且所选账户超出范围时,这个事件处理程序是否会自动释放? 还是它会继续存在,然后如果用户再次选择相同的账户,就会分配另一个处理程序,从而创建内存泄漏?
3个回答

3

每次用户再次选择相同的账户时,它会被重新分配。

为了再次分离事件,您应该调整附加事件的方式,以保留对其的引用:

EventHandlerType handler = (s, a) => UpdateTransactions(selected);
selected.OnNewTransaction += handler;

// When you want to remove the handler do this (make sure you "store" handler somewhere)
selected.OnNewTransaction -= handler;

1
事件处理程序只有在Account对象被垃圾回收时才成为垃圾回收的候选对象。因此,是的,除非您不明确从Account对象中分离它们,否则这些句柄将继续存在,并且是的,事件将包含您附加到其中的所有句柄。

0

你需要手动分离它


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接