2011-01-19 18 views
7

Quiero plantear una serie de eventos de mi clase de biblioteca, pero me preocupa que algunos suscriptores de eventos sean groseros y tarden mucho tiempo en procesar algunos eventos, bloqueando así el hilo que está provocando los eventos. Pensé que podía proteger la rosca elevación mediante un subproceso del grupo de subprocesos para elevar cada evento:¿Puedo usar BeginInvoke con un MulticastDelegate?

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

que funciona bien cuando sólo hay un abonado al evento, pero tan pronto como llega un segundo abonado, DataPacketReceived se convierte en una delegado de multidifusión y obtengo una excepción de argumento con el mensaje de error "El delegado debe tener solo un objetivo". ¿Hay alguna manera fácil de plantear el evento en un hilo separado, o tengo que iniciar un hilo y luego plantear el evento desde allí?

Respuesta

11

Encontré una pregunta similar en another site, y por supuesto Jon Skeet la había respondido. Para mi escenario, he optado por elevar el evento para cada suscriptor en un hilo separado:

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); 
    } 
} 
+2

correcta, pero tenga en cuenta que llamar 'BeginInvoke' en cada suscriptor individual no significa necesariamente que cada uno se ejecuta en un hilo separado. Es asunto del grupo de hilos. – Ani

+1

He estado viendo este problema varias veces en los últimos días. Es importante tener en cuenta que los objetos en 'receptores' no son realmente del tipo' EventHandler ', eso es un molde explícito. –