当另一个事件处理程序已经运行时,事件被触发时的.NET事件处理

时间:2015-12-16 17:42:54

标签: c# .net winforms events eventhandler

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

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

如果一个事件处理程序正在运行,并且现在引发了另一个事件,那么CLR是否会让当前事件处理程序完成,然后只是转到下一个事件处理程序? (“第二”事件可能是同一事件的第二次加注,或者是另一事件) 或者是否存在CLR暂停当前事件处理程序的情况,因为中间发生了一个事件,然后运行第二个事件处理程序,然后恢复到剩下的第一个事件处理程序的中间位置?

任何有关此订单的信息或文章都将不胜感激。

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

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

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

谢谢

1 个答案:

答案 0 :(得分:-1)

这与CLR或语言没有没有。它纯粹基于定义方法的类的特定实现。可以编写它以便在前一次调用的处理程序仍在运行时触发事件,或者它不能。如果你正在处理一个winforms程序,那么大多数对象触发事件都会在UI线程中触发它们,所以由于只有一个线程可以触发事件,所以当其他处理程序仍在运行时它无法触发它们,但是还有其他对象没有强制将它们用于单个线程,因此可以触发事件,而前一次调用的处理程序仍在运行。

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