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

2023-12-22

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

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();
   }

用户在一天中可能会实例化该对话框数十次甚至数百次。

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

Thanks


事件的发布者保留对每个订阅者的强引用。如果发布者的生命周期比订阅者长,那么当发布者存在时,订阅者将被固定在内存中。

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

我建议遵守用于发布事件的 dot net 框架指南 http://msdn.microsoft.com/en-us/library/w369ty8x.aspx,这建议使用受保护的虚拟方法来调用事件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将匿名侦听器与 C# 和垃圾收集中的事件分离 的相关文章

  • 将数组向左或向右旋转一定数量的位置,复杂度为 o(n)

    我想编写一个程序 根据用户的输入 正 gt 负 include
  • UML类图:抽象方法和属性是这样写的吗?

    当我第一次为一个小型 C 项目创建 uml 类图时 我在属性方面遇到了一些麻烦 最后我只是将属性添加为变量 lt
  • 如何避免情绪低落?

    我有一个实现状态模式每个状态处理从事件队列获取的事件 根据State因此类有一个纯虚方法void handleEvent const Event 事件继承基础Event类 但每个事件都包含其可以是不同类型的数据 例如 int string
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • 指针问题(仅在发布版本中)

    不确定如何描述这一点 但我在这里 由于某种原因 当尝试创建我的游戏的发布版本进行测试时 它的敌人创建方面不起作用 Enemies e level1 3 e level1 0 Enemies sdlLib 500 2 3 128 250 32
  • WPF TabControl,用C#代码更改TabItem的背景颜色

    嗨 我认为这是一个初学者的问题 我搜索了所有相关问题 但所有这些都由 xaml 回答 但是 我需要的是后台代码 我有一个 TabControl 我需要设置其项目的背景颜色 我需要在选择 取消选择和悬停时为项目设置不同的颜色 非常感谢你的帮助
  • Qt moc 在头文件中实现?

    是否可以告诉 Qt MOC 我想声明该类并在单个文件中实现它 而不是将它们拆分为 h 和 cpp 文件 如果要在 cpp 文件中声明并实现 QObject 子类 则必须手动包含 moc 文件 例如 文件main cpp struct Sub
  • 从路径中获取文件夹名称

    我有一些路c server folderName1 another name something another folder 我如何从那里提取最后一个文件夹名称 我尝试了几件事 但没有成功 我只是不想寻找最后的 然后就去休息了 Thank
  • 将自定义元数据添加到 jpeg 文件

    我正在开发一个图像处理项目 C 我需要在处理完成后将自定义元数据写入 jpeg 文件 我怎样才能做到这一点 有没有可用的图书馆可以做到这一点 如果您正在谈论 EXIF 元数据 您可能需要查看exiv2 http www exiv2 org
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • 如何使我的表单标题栏遵循 Windows 深色主题?

    我已经下载了Windows 10更新包括黑暗主题 文件资源管理器等都是深色主题 但是当我创建自己的 C 表单应用程序时 标题栏是亮白色的 如何使我自己的桌面应用程序遵循我在 Windows 中设置的深色主题 你需要调用DwmSetWindo
  • C++ fmt 库,仅使用格式说明符格式化单个参数

    使用 C fmt 库 并给定一个裸格式说明符 有没有办法使用它来格式化单个参数 example std string str magic format 2f 1 23 current method template
  • 将文本叠加在图像背景上并转换为 PDF

    使用 NET 我想以编程方式创建一个 PDF 它仅包含一个背景图像 其上有两个具有不同字体和位置的标签 我已阅读过有关现有 PDF 库的信息 但不知道 如果适用 哪一个对于如此简单的任务来说最简单 有人愿意指导我吗 P D 我不想使用生成的
  • mysql-connector-c++ - “get_driver_instance”不是“sql::mysql”的成员

    我是 C 的初学者 我认为学习的唯一方法就是接触一些代码 我正在尝试构建一个连接到 mysql 数据库的程序 我在 Linux 上使用 g 没有想法 我运行 make 这是我的错误 hello cpp 38 error get driver
  • C 中的异或运算符

    在进行按位操作时 我在确定何时使用 XOR 运算符时遇到一些困难 按位与和或非常简单 当您想要屏蔽位时 请使用按位 AND 常见用例是 IP 寻址和子网掩码 当您想要打开位时 请使用包含或 然而 XOR 总是让我明白 我觉得如果在面试中被问
  • 限制C#中的并行线程数

    我正在编写一个 C 程序来生成并通过 FTP 上传 50 万个文件 我想并行处理4个文件 因为机器有4个核心 文件生成需要更长的时间 是否可以将以下 Powershell 示例转换为 C 或者是否有更好的框架 例如 C 中的 Actor 框
  • 防止索引超出范围错误

    我想编写对某些条件的检查 而不必使用 try catch 并且我想避免出现 Index Out of Range 错误的可能性 if array Element 0 Object Length gt 0 array Element 1 Ob
  • 使用 libcurl 检查 SFTP 站点上是否存在文件

    我使用 C 和 libcurl 进行 SFTP FTPS 传输 在上传文件之前 我需要检查文件是否存在而不实际下载它 如果该文件不存在 我会遇到以下问题 set up curlhandle for the public private ke
  • 使用按位运算符相乘

    我想知道如何使用按位运算符将一系列二进制位相乘 但是 我有兴趣这样做来查找二进制值的十进制小数值 这是我正在尝试做的一个例子 假设 1010010 我想使用每个单独的位 以便将其计算为 1 2 1 0 2 2 1 2 3 0 2 4 虽然我
  • 恢复上传文件控制

    我确实阅读了以下帖子 C 暂停 恢复上传 https stackoverflow com questions 1048330 pause resume upload in c 使用 HTTP 恢复上传 https stackoverflow

随机推荐

  • 阶乘函数对 21 产生错误结果!以上

    for int i 0 i lt 25 i System out printf d d n i factorial i 上面的代码初始化了下面的阶乘方法 public static long factorial int num1 if nu
  • Scapy 可变长度字段

    我试图理解 PacketListField 和 FieldListField 之间的区别 有人可以让我知道在添加新协议时如何使用它们吗 我也不清楚StrLenField FieldLenField和PacketLenField 我正在尝试制
  • 使用带有 ldap_sasl_bind_s 函数的 kerberos 凭证通过 GSSAPI 进行 SASL 绑定

    我正在尝试使用 kerberos 凭据和 ldap sasl bind s 函数通过 GSSAPI 实现 SASL 绑定 我按照中描述的步骤操作ldap sasl bind s GSSAPI 凭证 BERVAL 结构中应提供什么 https
  • 函数参数中的 `type_alias{}` VS `char[N]{}`

    环境 x86 64Clang 6 0 0 函数的定义 void foo const char foo char 16 houston there is a problem foo type alias
  • 您可以在 iPhone 上执行 Ping 或 Traceroute 命令吗?

    奇怪的问题 我知道我可以在 OS X Objective C 中执行此操作 但是您可以对 iPhone 上的 IP 或 URL 运行 ping 吗 有框架支持吗 与执行跟踪路由相同 None
  • VBA查找多个文件

    我有这段代码 它根据搜索字符串查找文件名 以及文件路径 这段代码在查找单个文件时效果很好 我希望这个宏能够查找多个文件并使用逗号分隔显示它们的名称 Function FindFiles path As String SearchStr As
  • boost::python:编译失败,因为复制构造函数是私有的

    我使用 boost python 来包装 C 类 这个类不允许复制构造函数 但 python 模块总是想创建一个 C 类看起来像这样 简化 class Foo public Foo const char name constructor p
  • EntityMode.Map 与 Hibernate 4.2.6+ Spring 3.2

    我正在尝试使用动态休眠模型 下面是获取会话的代码片段 我已经声明了 hibernate default entity mode as dynamic map 在 hibernate 会话工厂配置 xml 中 Declared at clas
  • 强制 Backbone 将属性保存为文件

    有没有办法使用Model set and Model save以强制 Backbone 将数据作为文件发送到服务器的方式 就像您提交带有
  • Javascript库:混淆还是不混淆 - 这就是问题[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要编写一个与 GUI 相关的 javascript 库 它将给我的网站带来一点优势 就我可以提供的
  • []byte(字符串) 与 []byte(*字符串)

    我很好奇为什么 Go 不提供 byte string 方法 从性能角度来说 不会 byte string 复制输入参数并增加更多成本 尽管这看起来很奇怪 因为字符串是不可变的 为什么要复制它们 byte something 不是函数 或方法
  • 评估 PHP 中的 XPath 2.0

    我目前正在开发一个用 PHP 编写的项目 并且想要评估 XML 文件上的 XPath 表达式 由于文件相当复杂 我的 XPath 包含如下表达式为了 回报 循环或 XPath 2 引入的其他功能 不幸的是 PHP 的DOMXPath htt
  • facebook javascript sdk 登录在 iOS 上不起作用/移动设备的最佳实践

    我试图允许用户使用 javascript SDK 通过 facebook 登录登录我的 web 应用程序 它适用于桌面 safari 和 chrome 但弹出窗口在 iOS 上的 safari 和 chrome 上均失败 该错误直接发送至不
  • Laravel PHPUnit 模拟请求

    我正在我的控制器上执行 PHPUnit 但我似乎无法正确模拟请求 这是控制器 use Illuminate Http Request public function insert Request request some codes her
  • 无法生成临时类(结果=1)。错误CS0030:

    我正在尝试使用贝宝快速结账https www sandbox paypal com wsdl PayPalSvc wsdl https www sandbox paypal com wsdl PayPalSvc wsdl 当我打电话使用时
  • 在for循环中运行replace()方法?

    已经很晚了 我一直在尝试编写一个简单的脚本 将点云数据重命名为工作格式 我不知道我做错了什么 因为底部的代码工作正常 为什么for循环中的代码不起作用 它将其添加到列表中 但它只是没有被替换功能格式化 抱歉 我知道这不是调试器 但我真的很困
  • 如何使用 Gmail 中的标签来识别单个邮件而不是已由脚本处理的线程

    使用 google 邮件脚本 我尝试使用 API 将带有某些标签的新电子邮件上传到我们的 CRM 我无法检查邮件是否已上传 因此我必须在邮箱中为之前已处理过的邮件应用标签 不幸的是 谷歌脚本只允许您在线程级别添加或检查标签 由于新消息可以在
  • 使用 sqlplus 检索大型 clob 数据

    如何使用 sqlplus 将大 clob 数据从表中完全检索到标准输出 有一种方法可以使用特定于语言的数据库 API 来完全获得它 但是当我尝试纯粹使用 sqlplus 来获取它时 我遇到了几个问题 例如 输出缓冲区太小 最大 4000 字
  • Xamarin:应用程序未安装问题

    当我在 Android 移动设备上以调试模式安装应用程序时 它似乎已安装 但是 在签署应用程序并发布后 它并未安装在我的手机上 释放模式 它说 应用程序未安装 我尝试了一些方法但无法解决这个问题 我还用另一个密钥库进行了测试 但仍然无法安装
  • 将匿名侦听器与 C# 和垃圾收集中的事件分离

    假设我有一个名为 Dialog 的类 它扩展了 Form 对话框上有一个文本框和一个 确定 按钮 当用户单击 确定 时 文本框值将通过事件返回 public class Dialog Form public delegate void on