垃圾收集事件处理程序

时间:2010-02-03 13:29:06

标签: .net events c#-3.0 garbage-collection

我有一个Windows.Forms应用程序,其中ListBox填充了Account对象。 当用户从列表中选择一个帐户时,我附上一个EventHandler,负责在用户查看时更新所选的帐户交易。

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 个答案:

答案 0 :(得分: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 :(得分:1)

Account对象被自己收集用于垃圾时,事件处理程序只是垃圾收集的候选者。所以,是的,句柄继续存在,除非你没有明确地将它们从Account对象中分离出来,是的,事件将包含你附加到它的所有句柄。

答案 2 :(得分:0)

您需要手动分离