我想从我的库类中引发一系列事件,但我担心一些事件订阅者会粗鲁无礼,并花费很长时间来处理一些事件,从而阻塞引发事件的线程。我认为我可以通过使用线程池线程来引发每个事件来保护引发线程:
if (packet != null && DataPacketReceived != null)
{
var args = new DataPacketEventArgs(packet);
DataPacketReceived.BeginInvoke(this, args, null, null);
}当事件只有一个订阅者时,这种方法工作得很好,但是一旦有第二个订阅者到达,DataPacketReceived就会变成一个多播委托,我会得到一个参数异常,并显示错误消息“委托必须只有一个目标”。有没有一种简单的方法可以在单独的线程上引发事件,或者我必须启动一个线程,然后从那里引发事件?
发布于 2011-01-19 09:59:35
我在another site上发现了一个类似的问题,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);
}
}https://stackoverflow.com/questions/4731061
复制相似问题