如何在订阅者的线程上调用事件处理程序

本文关键字:线程 调用 事件处理 程序 | 更新日期: 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。只有当订阅线程具有有意义的上下文时,这才有效。