Por que e como evitar vazamentos de memory do Event Handler?

Acabei de perceber, lendo algumas perguntas e respostas no StackOverflow, que adicionando manipuladores de events usando += em C # (ou, eu acho, outras linguagens .net) pode causar vazamentos de memory comuns …

Eu usei manipuladores de events como este no passado muitas vezes, e nunca percebi que eles podem causar ou ter causado vazamentos de memory em meus aplicativos.

Como isso funciona (o que significa, por que isso realmente causa um memory leaks)?
Como posso resolver este problema ? Está usando -= para o mesmo manipulador de events suficiente?
Existem padrões de design comuns ou práticas recomendadas para lidar com situações como essa?
Exemplo: Como eu devo manipular um aplicativo que possui muitos segmentos diferentes, usando muitos manipuladores de events diferentes para criar vários events na interface do usuário?

Existe alguma maneira boa e simples de monitorar isso eficientemente em uma grande aplicação já construída?

    A causa é simples de explicar: enquanto um manipulador de events é inscrito, o editor do evento mantém uma referência ao assinante por meio do delegado do manipulador de events (supondo que o delegado seja um método de instância).

    Se o editor tiver mais tempo do que o assinante, ele manterá o assinante ativo mesmo quando não houver outras referências ao assinante.

    Se você cancelar a inscrição do evento com um manipulador igual, então sim, isso removerá o manipulador e o possível vazamento. No entanto, na minha experiência, isso raramente é realmente um problema – porque normalmente eu acho que o editor e o assinante têm aproximadamente vidas iguais de qualquer maneira.

    É uma causa possível … mas na minha experiência é bastante exagerada. Sua milhagem pode variar, é claro … você só precisa ter cuidado.

    Sim, -= é o suficiente, no entanto, pode ser muito difícil acompanhar todos os events atribuídos. (para detalhes, veja o post de Jon). Em relação ao padrão de design, dê uma olhada no padrão de evento fraco .

    Um evento é realmente uma linked list de manipuladores de events

    Quando você faz + = new EventHandler no evento, realmente não importa se esta function em particular foi adicionada como listener antes, ela será adicionada uma vez por + =.

    Quando o evento é gerado, ele passa pela linked list, item por item e chama todos os methods (manipuladores de events) adicionados a essa lista. É por isso que os manipuladores de events ainda são chamados mesmo quando as páginas não estão mais em execução, contanto que estão vivos (enraizados) e estarão vivos enquanto estiverem ligados. Então, eles serão chamados até que o manipulador de events seja desfeito por um – = new EventHandler.

    Veja aqui

    e MSDN AQUI