关于事件引发的假设
本文关键字:假设 事件 于事件 | 更新日期: 2023-09-27 18:18:47
想象下面的类:
class A
{
public event EventHandler AnyEvent;
}
创建类A
的实例,并附加一些事件处理程序。现在,如果AnyEvent
被触发,我不会假设事件处理程序在另一个线程上执行,而不是在创建对象的线程上执行。如果您在GUI线程上创建对象,并且事件处理程序对GUI元素执行操作,那么这将是非常重要的。这将迫使我使用适当的调用模式。
如果你使用接口定义事件,它真的会变得很糟糕:
interface B
{
event EventHandler SomeEvent;
}
现在一个实现可以从原始线程引发事件,下一个实现可以从第二个线程引发事件。这可能导致您的应用程序成功地使用其中一个实现,而在使用另一个实现时失败。
我认为代码应该总是透明的-这不是!如果我不创建另一个线程,我不假设我的方法是从我的home线程以外的任何地方执行的。
是否有我没有考虑到的方面?任何会使我的假设无效的?
事件没有魔力。事件在引发事件的线程上处理。它与创建对象的线程无关。
线程是类的消费者的责任,而不是类的作者,所以你的假设是不正确的。
我们应该假设一个类不是线程安全的,除非文档中说明它是线程安全的。即使是大多数内建的。net类也不是线程安全的,除非它们声明是。
调用事件就是使用函数指针等机制调用某个方法(或方法集合)。
事件对于附加它们的线程是完全无关的,并且没有任何其他信息可以导致正确调用正确线程上的方法。
也许你是从COM的日子里得出你的假设?
事件的处理程序回调在引发事件的同一线程上。