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

时间:2014-10-12 12:19:22

标签: c# .net multithreading events

在我的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。

1 个答案:

答案 0 :(得分:1)

一般来说,这个想法没有意义,因为你不能在不同的线程上任意中断运行代码并注入事件。这种架构会导致大量的随机破损。

让订阅者处理同步和编组。他们知道他们正在运行什么线程以及如何安全地将呼叫编组到其上。

考虑捕获SynchronizationContext处理程序中的当前SomethingHappened.add并将事件发送/发布到SynchronizationContext。这仅在订阅线程具有有意义的上下文时才有效。