关于事件引发的假设

本文关键字:假设 事件 于事件 | 更新日期: 2023-09-27 18:18:47

想象下面的类:

class A
{
     public event EventHandler AnyEvent;
}

创建类A的实例,并附加一些事件处理程序。现在,如果AnyEvent被触发,我不会假设事件处理程序在另一个线程上执行,而不是在创建对象的线程上执行。如果您在GUI线程上创建对象,并且事件处理程序对GUI元素执行操作,那么这将是非常重要的。这将迫使我使用适当的调用模式。

如果你使用接口定义事件,它真的会变得很糟糕:

interface B
{
     event EventHandler SomeEvent;
}

现在一个实现可以从原始线程引发事件,下一个实现可以从第二个线程引发事件。这可能导致您的应用程序成功地使用其中一个实现,而在使用另一个实现时失败。

我认为代码应该总是透明的-这不是!如果我不创建另一个线程,我不假设我的方法是从我的home线程以外的任何地方执行的。

是否有我没有考虑到的方面?任何会使我的假设无效的?

关于事件引发的假设

事件没有魔力。事件在引发事件的线程上处理。它与创建对象的线程无关。

线程是类的消费者的责任,而不是类的作者,所以你的假设是不正确的。

我们应该假设一个类不是线程安全的,除非文档中说明它是线程安全的。即使是大多数内建的。net类也不是线程安全的,除非它们声明是。

这取决于类的消费者是否知道线程。

调用事件就是使用函数指针等机制调用某个方法(或方法集合)。

事件对于附加它们的线程是完全无关的,并且没有任何其他信息可以导致正确调用正确线程上的方法。

也许你是从COM的日子里得出你的假设?

事件的处理程序回调在引发事件的同一线程上。