弱事件+ lambda =内存泄漏?

时间:2017-05-10 12:54:00

标签: c# wpf lambda garbage-collection

玩弱事件

public class Test
{
    public Test(Button button)
    {
        WeakEventManager<Button, RoutedEventArgs>.AddHandler(button, nameof(Button.Click),
            (s, e) => MessageBox.Show("Tada"));
    }
}

使用此代码

Test _test;
void ButtonCreate_Click(object sender, RoutedEventArgs e) => _test = new Test(button);
void ButtonDelete_Click(object sender, RoutedEventArgs e) => _test = null;
void ButtonGC_Click(object sender, RoutedEventArgs e)
{
    GC.Collect(2);
    GC.WaitForPendingFinalizers();
}

看起来这个事件处理程序的生命周期比我预期的要长。

这是一个演示,我单击创建 3次,然后删除 GC ,但单击按钮仍将执行所有事件处理程序:

我的问题是这里有什么问题?

没有lambda就没有这样的问题

public class Test
{
    public Test(Button button)
    {
        WeakEventManager<Button, RoutedEventArgs>.AddHandler(button,
            nameof(Button.Click), Button_Click);
    }
    void Button_Click(object sender, RoutedEventArgs e) => MessageBox.Show("Tada");
}

但是another problem出现了,除非按下 GC ,否则仍会在删除之后调用事件处理程序!

0 个答案:

没有答案