在另一个事件处理程序已在运行时激发事件时的.NET事件处理

本文关键字:事件处理 事件 NET 运行时 另一个 程序 | 更新日期: 2023-09-27 18:27:00

有一个问题让我好奇了很长一段时间
假设这种情况:
您在C#中创建了一个程序,该程序有一些类,您在其中定义了一些事件,
而其他类使用这些事件——它们为它们实现事件处理程序方法。

我的问题:对于事件同时发生的情况,CLR运行事件处理程序的"规则"是什么?

如果一个事件处理程序正在运行,而现在又引发了另一个事件,CLR会让当前事件处理程序完成,然后转到下一个事件处理器吗?("第二个"事件可能是同一事件的第二次引发,也可能是不同的事件)
或者,是否存在这样的情况:CLR由于出现在中间的事件而暂停当前事件处理程序,然后运行第二个事件处理程序然后恢复到第一个剩余事件处理程序的中间?

任何在此订购的信息或文章,将不胜感激。

BTW:
对于这个问题,请假设两种可能的情况:
1) 具有事件和事件处理程序的类不是控件
(您编写的继承类型object而非类型Control的简单类)
2) 具有事件和事件处理程序的类继承类Control(Windows窗体)

我提到这一点是因为两者的行为/规则可能不同。

此外,如果您能理解以下事情,我将不胜感激,这些事情可能会影响这两个问题的答案:
-Application.DoEvents()方法
-计时器s
-像这样的任何其他类/方法,除了我们在"正常"情况下可能想到的简单结果之外,可能会给出不同的结果。。

感谢

在另一个事件处理程序已在运行时激发事件时的.NET事件处理

这与CLR或语言无关。它完全基于定义方法的类的具体实现。它可以被编写为在上一次调用的处理程序仍在运行时触发事件,也可以不触发。如果你处理的是winforms程序,那么大多数对象触发事件都是在UI线程中触发的,所以由于只有一个线程可以触发事件,所以当其他处理程序仍在运行时,它永远无法触发它们,但也有其他对象不会将其使用强制到单个线程,因此可以在前一次调用的处理程序仍在运行时激发事件。

所以,你真正能做的就是查看文档/源代码,或者做一些实验测试,看看任何特定的类能做什么,或者安全地假设最坏的情况。没有一般的案例答案。