想象一下以下课程:
class A
{
public event EventHandler AnyEvent;
}
您创建了类A
的实例,并附加了一些事件处理程序。现在,如果引发AnyEvent
,我不会认为事件处理程序是在另一个线程上执行的,而不是我创建对象的线程。如果您在GUI线程上创建了对象,并且事件处理程序对GUI元素执行操作,那么这将是最重要的。这将迫使我使用适当的调用模式。
如果使用定义事件的接口,它真的变得邪恶:
interface B
{
event EventHandler SomeEvent;
}
现在一个实现可以从原始线程引发事件,从第二个线程引发下一个事件。这可能会导致您的应用程序成功使用该应用程序,并且与其他实现失败。
我认为编码应该始终是透明的 - 这不是!如果我不创建另一个线程,我不认为我的方法是从我的 home 线程以外的任何其他线程执行的。
我有没有考虑过任何方面?任何会使我的假设失效的方法?
答案 0 :(得分:3)
事件没有魔力。事件在引发它们的线程上处理。它与创建对象的线程无关。
答案 1 :(得分:1)
线程是班级消费者的责任,而不是班级的作者,所以你的假设不正确。
应该假设一个类不是线程安全的,除非它被记录为线程安全的。即使大多数内置的.NET类都不是线程安全的,除非他们说它们是。
要让班级的消费者了解线程。
答案 2 :(得分:1)
调用事件只是使用函数指针等机制调用某个方法(或方法集合)。
事件完全无视附加它们的线程,并且没有任何其他信息可能导致在正确的线程上正确调用方法。
也许你正在从COM时代那里得出你的假设?
答案 3 :(得分:0)
事件的处理程序回调与引发事件的线程相同。