【问题标题】:Controls events causes memory leaks?控制事件导致内存泄漏?
【发布时间】:2015-02-26 13:06:09
【问题描述】:

订阅事件会导致内存泄漏吗?

也就是说,如果在给定的页面中我这样做了

public TestPage()
{
    this.InitializeComponent();

    myButton.Click += MyButton_Click;

}

private void MyButton_Click(object sender, RoutedEventArgs e)
{
      Debug.WriteLine("Hello");
}

我需要打电话吗

myButton.Click += MyButton_Click;

如果是,我应该在哪里调用它?

【问题讨论】:

  • 订阅事件实际上使您的对象保持活动状态。因为当事件被调用时,您的类需要处于活动状态才能运行它的注册委托。
  • 您可以在 OnNavigatedTo 中订阅事件并在 OnNavigatedFrom 中取消订阅 -= 可能会有所帮助

标签: c# xaml windows-phone windows-phone-8.1


【解决方案1】:

不,当页面超出范围时,CLR 会将其标记为准备好进行垃圾回收,包括其事件处理程序。您无需在页面中取消注册事件处理程序。

当事件处理程序位于 other 对象而不是引发事件的对象时,情况会有所不同。在您给出的示例中,情况并非如此。

如果订阅另一个对象事件的对象首先超出范围,它必须从事件处理程序中取消订阅,否则它实际上只会在事件源也超出范围时被标记为垃圾回收。

如果引发事件的对象首先超出范围,则没有问题,因为订阅也会超出范围。

【讨论】:

    猜你喜欢
    • 2015-07-06
    • 2014-06-07
    • 2013-11-20
    • 2011-10-28
    • 2016-01-18
    • 2012-12-13
    • 1970-01-01
    • 2011-01-08
    • 2011-02-01
    相关资源
    最近更新 更多