我想从我的库类中引发一系列事件,但是我担心一些事件订阅者会很粗鲁并且需要花费很长时间来处理某些事件,从而阻止了引发事件的线程。我以为我可以通过使用线程池线程来提升每个事件来保护提升线程:
if (packet != null && DataPacketReceived != null)
{
var args = new DataPacketEventArgs(packet);
DataPacketReceived.BeginInvoke(this, args, null, null);
}
当事件只有一个订阅者时,它工作正常,但是一旦第二个订阅者到达,DataPacketReceived
就会成为多播委托,并且我得到一个参数异常,并显示错误消息“委托必须具有只有一个目标。“是否有一种简单的方法可以在单独的线程上引发事件,或者我是否必须启动一个线程然后从那里引发事件?
答案 0 :(得分:12)
我在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);
}
}