我能使用BeginInvoke与MulticastDelegate吗?

11

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

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

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

1个回答

16

2
正确,但请注意,在每个订阅者上调用BeginInvoke并不一定意味着每个订阅者都会在单独的线程上运行。这是线程池的职责。 - Ani
2
我在过去几天里多次研究了这个问题,需要注意的是receivers中的对象实际上并不是EventHandler<DataPacketEventArgs>类型,那只是一个显式转换。 - Trent Scheffert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接