2010-08-13 14 views
8

¿Qué pasará cuando 10 hilos se suscriban al mismo evento y el evento se dispare? ¿Qué hilo lo levantará?Multiple Threads suscribiendo el mismo evento

+1

¿Qué quiere decir hilos? ¿Cómo el hilo puede suscribirse al evento? Creo que quisiste decir algo diferente ... – Incognito

+0

10 Hilos que ejecutan el mismo método que se suscribe a un evento. – koumides

+0

Esta pregunta es un poco confusa o puede no entenderse correctamente. Si el evento es un evento de Windows (es decir, creado por CreateEvent) y hay varios hilos esperando su señalización, la respuesta de ScottTx parece ser correcta. Si el evento es el evento del marco de la aplicación (similar al evento Delphi o C# OnClick de un botón), ¡muchas respuestas pueden ser correctas! (pero, de nuevo, ¿cómo pueden suscribirse múltiples subprocesos a un evento de aplicación? !!).Este mensaje está destinado a darles a los lectores un aviso, a pesar de que esta es una vieja pregunta. – ssh

Respuesta

16

Thread's no suscribirse a eventos, objetos do. Cuando se desencadena un evento, todos los controladores registrados se ejecutan en el mismo subproceso (el que generó el evento). No hay instalaciones integradas para que los eventos se activen en varios hilos.

Un controlador puede elegir reenviar la información del evento a un hilo separado, si lo desea, pero eso no forma parte del mecanismo integrado de envío de eventos.

+0

Si desea una vista más asíncrona de los eventos, puede consultar [Rx] (http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx). Usando Rx, es bastante fácil ordenar los eventos a un hilo en particular (asumiendo que tiene un 'SynchronizationContext' para calcular, por supuesto). –

+0

creo que los hilos también son objetos ... :) – ultrajohn

+0

@ultrajohn: booooo! :) –

1

Creo que lo que quiere decir aquí es que múltiples objetos en subprocesos separados se suscriben a un evento.

Se llamarán todos los controladores pero en el mismo subproceso que invocó el evento.

0

La respuesta a su pregunta, supongo que depende de la implementación del despachador de eventos ... Por lo general, utiliza una lista para realizar un seguimiento de todos los controladores de eventos que se suscribieron a un evento en particular, por lo que es muy probable que este tipo de implementación, el primer controlador que se dispara es el primer controlador de eventos que se suscribió si, por supuesto, llama a todos los procedimientos relevantes de forma sincrónica, si no, entonces depende ... solo un pensamiento ...

0

Si desea saber qué objeto captará el evento, cada objeto que se suscriba a un evento seleccionará ese evento, pero cada uno se ejecutará en el hilo en el que ocurrió el evento.

Si desea saber qué objeto recogerá ese evento primero, vea la respuesta de ultrajohns.

0

Creo que entiendo su pregunta. Quiere decir que su objeto expone un evento que el usuario de su objeto puede suscribirse. Si 10 usuarios diferentes de tu objeto se han suscrito a este evento, y en algún momento disparas el evento, ¿qué orden (o al mismo tiempo) se invocarían los manejadores de eventos?

Respuesta: Dado que la ejecución del controlador de eventos ocurre en el mismo hilo que lo desencadena (en este caso el hilo de procesamiento de su objeto) solo puede procesar una función de manejador a la vez. La orden no está garantizada (es decir, no necesariamente el primer suscriptor se ejecutaría primero y el último se ejecutaría en último lugar). Espero que esto responda tu pregunta. La conclusión es que se llamaría a todos los 10 manejadores y ninguno estaría en paralelo. Serán ejecutados uno después de otro. He visto personas subíndices accidentalmente para guardar el evento dos veces y luego ver la acción sucediendo dos veces y tener dificultades para entender por qué algunas cosas están sucediendo varias veces.

3

Si por "evento" quiere decir un evento de sincronización de Win32 (que es la forma en que leo la pregunta), entonces depende de cómo se crea EventWaitHandle. Si se reinicia manualmente, el evento señalará todos los hilos y todos se ejecutarán. Si se reinicia automáticamente, se señalará y ejecutará un solo hilo. Cualquiera de sus 10 hilos esperando en el evento podría ser elegido.