如何在订阅者的线程上调用事件处理程序?
在我的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
。这仅适用于订阅线程具有有意义的上下文的情况。
在Qt中这是经历了事件循环。稍后将信号发送到正确的线程。涉及的运行代码不会中断。我想答案是“不可能在C#中”? – 2014-10-12 12:59:52
我不认为Qt会中断正在运行的线程。它可能排队消息或事件,但从不会中断运行代码。用C++比用C#更加不可能。 – usr 2014-10-12 13:05:11
[类似问题](http://stackoverflow.com/a/2459683/815938)之前曾经讨论过, – kennyzx 2014-10-12 12:44:07