微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从C#中的事件和垃圾收集中分离匿名侦听器

假设我有一个名为Dialog的类,它扩展了Form.对话框上有一个文本框和一个OK按钮,当用户单击OK时,通过事件返回文本框值:

public class Dialog: Form
{
    public delegate void onDialogValueReturned(object sender,DialogEventArgs e);
    public event onDialogValueReturned DialogValueReturned;
 .
 .
 .

  OKButton.Click += (sender,evt) =>
        {
            DialogEventArgs e = new DialogEventArgs();
            e.Value =myTextBox.Text;                
            DialogValueReturned(this,e);
            this.Close();
        };

在我的调用形式中,我在本地方法中实例化一个对话框:

private void Foo()
  {
        Dialog D = new Dialog("blah blah");
        D.DialogValueReturned += (dialog,evt) =>
            {

               //do something with evt.Value

            };


        D.ShowDialog();
   }

在一天中,用户可以将该对话框实例化数十次甚至数百次.

当作用域离开私有方法时,垃圾收集器是否会自动清除与对话框实例相关的所有内容,包括匿名侦听器的所有管道?

谢谢

解决方法

活动的发布者保留对每个订阅者的强烈引用.如果发布者的寿命比订阅者长,那么订阅者将在发布者存在时固定在内存中.

在您的示例中,发布者仅存在于私有方法的范围内,因此对话框和处理程序将在方法返回后的某个时刻进行垃圾回收.

我建议遵守dot net framework guidelines for publishing an event,建议使用受保护的虚拟方法调用事件.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐