如何在订阅者的线程上调用事件处理程序
本文关键字:线程 调用 事件处理 程序 | 更新日期: 2023-09-27 18:26:19
在我的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。
通常,这个想法没有意义,因为您不能任意中断不同线程上正在运行的代码并注入事件。这种架构会导致大量的随机破坏。
使订阅服务器处理同步和封送处理。他们知道自己在哪个线程上运行,以及如何安全地将调用编组到线程上
考虑在SomethingHappened.add
处理程序中捕获当前SynchronizationContext
,并将事件发送/发布到该SynchronizationContext
。只有当订阅线程具有有意义的上下文时,这才有效。