Si configuro varios controladores de eventos, así:
_webservice.RetrieveDataCompleted += ProcessData1;
_webservice.RetrieveDataCompleted += ProcessData2;
¿En qué orden se ejecutan los controladores cuando se activa el evento RetrieveDataCompleted
? ¿Se ejecutan en el mismo hilo y secuencialmente en el orden en que están registrados?
c#
asynchronous
event-handling
Phillip Ngan
fuente
fuente
Respuestas:
Actualmente, se ejecutan en el orden en que se registran. Sin embargo, este es un detalle de implementación, y no confiaría en que este comportamiento se mantenga igual en futuras versiones, ya que no es requerido por las especificaciones.
fuente
Desde aquí: Clase delegada
fuente
add
yremove
un evento no necesariamente se puede implementar como un delegado de transmisión múltiple.Puede cambiar el orden desconectando todos los controladores y volviendo a adjuntarlos en el orden deseado.
fuente
El orden es arbitrario. No puede confiar en que los controladores se ejecuten en un orden particular de una invocación a la siguiente.
Editar: Y también, a menos que sea solo por curiosidad, el hecho de que necesites saberlo es indicativo de un problema de diseño grave .
fuente
Se ejecutan en el orden en que están registrados.
RetrieveDataCompleted
es un delegados de multidifusión . Estoy mirando a través del reflector para intentar verificar, y parece que se usa una matriz detrás de escena para realizar un seguimiento de todo.fuente
Si alguien necesita hacer esto en el contexto de un System.Windows.Forms.Form, aquí hay un ejemplo que invierte el orden del evento Shown.
fuente
Un MulticastDelegate tiene una lista vinculada de delegados, denominada lista de invocación, que consta de uno o más elementos. Cuando se invoca un delegado de multidifusión, los delegados de la lista de invocación se llaman sincrónicamente en el orden en que aparecen. Si ocurre un error durante la ejecución de la lista, se lanza una excepción.
fuente
Pero nadie dice que la lista de invocación mantenga a los delegados en el mismo orden en que se agregan. Por tanto, el orden de invocación no está garantizado.
fuente
Esta es una función que colocará la nueva función de controlador de eventos donde desee en la lista de invocaciones de múltiples delegados.
Entonces siempre puede eliminar la función con un '- =' donde sea conveniente en su código.
PD: no estoy haciendo ningún manejo de errores para el parámetro 'posición'.
fuente
Tuve un problema similar. En mi caso se solucionó muy fácilmente. Nunca había visto a un delegado que no usara el operador + =. Mi problema se solucionó al tener un delegado siempre agregado al final, todos los demás siempre se agregan al principio. El ejemplo del OP sería algo como:
En el primer caso, ProcessData1 se llamará en último lugar. En el segundo caso, ProcessData2 se llamará primero.
fuente