在我的C ++ / Qt应用程序中,每当我想提出信号/事件时,我都会这样做:
emit Event();
这将调用Event()
的所有处理程序与订阅此事件的对象在同一个线程上。
C#似乎没有提供类似的东西,所以我该怎么做?
我有一个课程,我们称之为EventRaiser
,它有一个SomethingHappened
事件和一个在需要时引发事件的方法:
class EventRaiser
{
public event EventHandler SomethingHappened;
void RaiseEvent()
{
var anyoneWhosInterested = SomethingHappened;
if (anyoneWhosInterested != null)
{
try { anyoneWhosInterested(this, new EventArgs()); }
catch { /* we don't care */ }
}
}
}
我的问题是RaiseEvent()
将调用被调用的线程RaiseEvent()
上的处理程序。但我需要在订阅该事件的线程上调用处理程序。
我该怎么做?
我使用的是.NET 2.0和Visual Studio 2012。
答案 0 :(得分:1)
一般来说,这个想法没有意义,因为你不能在不同的线程上任意中断运行代码并注入事件。这种架构会导致大量的随机破损。
让订阅者处理同步和编组。他们知道他们正在运行什么线程以及如何安全地将呼叫编组到其上。
考虑捕获SynchronizationContext
处理程序中的当前SomethingHappened.add
并将事件发送/发布到SynchronizationContext
。这仅在订阅线程具有有意义的上下文时才有效。