关于事件提升的假设

时间:2011-12-23 23:11:22

标签: c# events

想象一下以下课程:

class A
{
     public event EventHandler AnyEvent;
}

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

如果使用定义事件的接口,它真的变得邪恶:

interface B
{
     event EventHandler SomeEvent;
}

现在一个实现可以从原始线程引发事件,从第二个线程引发下一个事件。这可能会导致您的应用程序成功使用该应用程序,并且与其他实现失败。

我认为编码应该始终是透明的 - 这不是!如果我不创建另一个线程,我不认为我的方法是从我的 home 线程以外的任何其他线程执行的。

我有没有考虑过任何方面?任何会使我的假设失效的方法?

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

应该假设一个类不是线程安全的,除非它被记录为线程安全的。即使大多数内置的.NET类都不是线程安全的,除非他们说它们是。

要让班级的消费者了解线程。

答案 2 :(得分:1)

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

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

也许你正在从COM时代那里得出你的假设?

答案 3 :(得分:0)

事件的处理程序回调与引发事件的线程相同。