Pergunta

Alguns anos atrás, li um livro que descreveu como você poderia substituir o evento padrão implementação 'despachante' em .NET com seu próprio processador.

    class foo {
       public event EventHandler myEvent;
       ...
    }

    ...
      myFoo.myEvent += myBar1.EventHandler;
      myFoo.myEvent += myBar2.EventHandler;

Sempre que o evento é acionado, os dois manipuladores myBar1 e myBar2 será chamado.

Se bem me lembro, a implementação padrão desse ciclo usa uma lista ligada e simplesmente itera sobre a lista e chama os delegados EventHandler em ordem.

A minha pergunta é duas vezes:

  1. Alguém sabe qual livro que estava lendo?
  2. Por que você quer para substituir a implementação padrão (que pode ser respondidas no livro)?

Edit: O livro que eu estava referindo-se a era de fato CLR de Jeffrey Richter via C #

Foi útil?

Solução

Poderia ter sido um dos muitos livros ou artigos na web.

Existem várias razões pelas quais você pode querer mudar a forma como os eventos são subscrito / unsubscribed:

  • Se você tem muitos eventos, muitos dos quais podem muito bem não ser inscrito, você pode querer usar EventHandlerList para reduzir seu uso de memória
  • Você pode desejar autenticar subscrição / cancelamento de assinatura
  • Você pode querer usar uma referência fraca para evitar tempo de vida do assinante de ser amarrado ao seu
  • Você pode querer alterar o bloqueio associado com subscrição / cancelamento de assinatura

Eu tenho certeza que existem mais - esses são em cima da minha cabeça:)

EDIT: Note também que há uma diferença entre ter uma forma personalizada de lidar com subscrição / cancelamento e ter uma forma personalizada de elevar o evento (que pode chamar GetInvocationList e garantia de que todos os manipuladores são chamados, independentemente de exceções, por exemplo) .

Outras dicas

Eu me lembro de algo semelhante no CLR de Jeffrey Richter via C #. Editar:. Eu definitivamente lembrar que ele entra em detalhes sobre isso

Existem algumas razões diferentes para tomar o controle do registro de eventos. Um deles é reduzir o inchaço de código quando você tem TONELADAS de eventos. Acho Jeffrey entrou isso em detalhes no livro ...

  1. Não
  2. Você pode, por exemplo, necessidade de quebrar a cadeia de chamada com base no resultado de um dos manipuladores. Digamos que seu objeto CustomEventArgs tem uma propriedade 'Bloqueado', que quando definido como verdadeiros suprime todas as invocações mais manipulador de eventos.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top