我可以将BeginInvoke与MulticastDelegate一起使用吗?

Don*_*kby 10 .net events multithreading delegates begininvoke

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

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

当事件只有一个订阅者时,这很好,但是一旦第二个订阅者到达,DataPacketReceived就会成为多播委托,并且我得到一个参数异常,并显示错误消息"委托必须只有一个目标".是否有一种简单的方法可以在单独的线程上引发事件,或者我是否必须启动一个线程然后从那里引发事件?

Don*_*kby 15

我在另一个网站上发现了一个类似的问题,当然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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 正确,但请注意,在每个订阅者上调用"BeginInvoke"并不一定意味着每个订阅者都会在一个单独的线程上运行.这是线程池的业务. (2认同)
  • 我在过去的几天里一直在研究这个问题,需要注意的是,`receivers`中的对象实际上不是'EventHandler &lt;DataPacketEventArgs&gt;'类型的,这是一个明确的强制转换。 (2认同)