我想从我的库类中引发一系列事件,但我担心有些事件订阅者会很粗鲁,并且花费很长时间来处理某些事件,从而阻止引发事件的线程。我认为我可以通过使用线程池线程来引发每个事件来保护引发线程:
if (packet != null && DataPacketReceived != null)
{
var args = new DataPacketEventArgs(packet);
DataPacketReceived.BeginInvoke(this, args, null, null);
}
当只有一个事件订阅者时,这很好用,但是一旦第二个订阅者到来,DataPacketReceived
就会变成多播委托,并且我会收到一个参数异常,错误信息为“委托必须只有一个目标”。是否有一种简单的方法在单独的线程上引发事件,还是我必须启动一个线程,然后从那里引发事件?
BeginInvoke
并不一定意味着每个订阅者都会在单独的线程上运行。这是线程池的职责。 - Anireceivers
中的对象实际上并不是EventHandler<DataPacketEventArgs>
类型,那只是一个显式转换。 - Trent Scheffert