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

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

概述假设我有一个名为Dialog的类,它扩展了Form.对话框上有一个文本框和一个OK按钮,当用户单击OK时,通过事件返回文本框值: public class Dialog: Form{ public delegate void onDialogValueReturned(object sender, DialogEventArgs e); public event onDialog 假设我有一个名为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,建议使用受保护的虚拟方法来调用事件.

总结

以上是内存溢出为你收集整理的从C#中的事件和垃圾收集中分离匿名侦听器全部内容,希望文章能够帮你解决从C#中的事件和垃圾收集中分离匿名侦听器所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1234470.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存