11

我想从我的库类中引发一系列事件,但我担心某些事件订阅者会很粗鲁并且需要很长时间来处理某些事件,从而阻塞引发事件的线程。我想我可以通过使用线程池线程来引发每个事件来保护引发线程:

if (packet != null && DataPacketReceived != null)
{
    var args = new DataPacketEventArgs(packet);
    DataPacketReceived.BeginInvoke(this, args, null, null);
}

当事件只有一个订阅者时,这可以正常工作,但是一旦第二个订阅者到达,DataPacketReceived就会成为多播委托,并且我收到带有错误消息的参数异常,“委托必须只有一个目标。” 有没有一种简单的方法可以在单独的线程上引发事件,还是我必须启动一个线程然后从那里引发事件?

4

1 回答 1

16

我在另一个网站上发现了一个类似的问题,当然 Jon Skeet 已经回答了。对于我的场景,我选择在单独的线程上为每个订阅者引发事件:

if (packet != null && DataPacketReceived != null)
{
    var args = new DataPacketEventArgs(packet);
    var receivers = DataPacketReceived.GetInvocationList();
    foreach (EventHandler<DataPacketEventArgs> receiver in receivers)
    {
        receiver.BeginInvoke(this, args, null, null);
    }
}
于 2011-01-19T01:59:34.643 回答