Se eu configurar vários manipuladores de eventos, como:
_webservice.RetrieveDataCompleted += ProcessData1;
_webservice.RetrieveDataCompleted += ProcessData2;
em que ordem os manipuladores são executados quando o evento RetrieveDataCompleted
é disparado? Eles são executados no mesmo thread e sequencialmente na ordem em que são registrados?
c#
asynchronous
event-handling
Phillip Ngan
fonte
fonte
Respostas:
Atualmente, eles são executados na ordem em que são registrados. No entanto, este é um detalhe de implementação, e eu não confiaria que esse comportamento permanecesse o mesmo em versões futuras, uma vez que não é exigido pelas especificações.
fonte
A partir daqui: classe de delegados
fonte
add
e,remove
um evento pode não ser necessariamente implementado como um delegado multi-cast.Você pode alterar a ordem desanexando todos os manipuladores e, em seguida, reconectando na ordem desejada.
fonte
A ordem é arbitrária. Você não pode contar com os manipuladores sendo executados em qualquer ordem específica de uma chamada para a próxima.
Edit: E também - a menos que seja apenas por curiosidade - o fato de que você precisa saber é indicativo de um sério problema de design.
fonte
Eles são executados na ordem em que são registrados.
RetrieveDataCompleted
é um Multicast Delegates . Estou olhando pelo refletor para tentar verificar, e parece que um array é usado nos bastidores para controlar tudo.fonte
Se alguém precisar fazer isso no contexto de um System.Windows.Forms.Form, aqui está um exemplo invertendo a ordem do evento Mostrado.
fonte
Um MulticastDelegate tem uma lista vinculada de delegados, chamada de lista de invocação, que consiste em um ou mais elementos. Quando um delegado multicast é invocado, os delegados na lista de invocação são chamados de forma síncrona na ordem em que aparecem. Se ocorrer um erro durante a execução da lista, uma exceção será lançada.
fonte
Mas ninguém diz que a lista de invocação mantém os delegados na mesma ordem em que são adicionados. Assim, a ordem de invocação não é garantida.
fonte
Esta é uma função que colocará a nova função do manipulador de eventos onde você quiser na lista de invocação multidelegate.
Então você sempre pode remover a função com um '- =' em qualquer lugar do seu código.
PS - Não estou tratando de erros para o parâmetro 'posição'.
fonte
Eu tive um problema parecido. No meu caso, foi corrigido muito facilmente. Eu nunca tinha visto um delegado que não usasse o operador + =. Meu problema foi resolvido por ter um delegado sempre adicionado no final, todos os outros são sempre adicionados no início. O exemplo do OP seria algo como:
No primeiro caso, ProcessData1 será chamado por último. No segundo caso, ProcessData2 será chamado primeiro.
fonte