Lambdas nos métodos de extensão: possível vazamento de memória?

Eu apenas dei uma resposta a umpergunta bastante simples usando um método de extensão. Mas depois de anotá-la, lembrei-me de que você não pode cancelar a inscrição de um lambda de um manipulador de eventos.

Até agora não há grande problema. Mas como tudo isso se comporta dentro de um método de extensão?

Abaixo está o meu código cortado novamente. Então, alguém pode me esclarecer, se isso levar a uma infinidade de temporizadores na memória, se você chamar esse método de extensão várias vezes?

Eu diria que não, porque o escopo do timer é limitado nessa função. Então, depois de sair, ninguém mais terá uma referência a esse objeto. Estou um pouco inseguro, porque estamos aqui dentro de uma função estática em uma classe estática.

public static class LabelExtensions
{
    public static Label BlinkText(this Label label, int duration)
    {
        System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();

        timer.Interval = duration;
        timer.Tick += (sender, e) =>
            {
                timer.Stop();
                label.Font = new Font(label.Font, label.Font.Style ^ FontStyle.Bold);
            };

        label.Font = new Font(label.Font, label.Font.Style | FontStyle.Bold);
        timer.Start();

        return label;
    }
}
Atualizar

Só para esclarecer eu useiSystem.Windows.Forms.Timer. Portanto, a partir de suas respostas, parece que especialmente o uso dessa classe de timer foi a escolha certa, pois faz tudo da maneira que eu esperaria nesse caso. Se você tentar outra classe de timer nesse caso, poderá ter problemas comoMateus descobriu. Eu tambémencontrou uma maneira usandoWeakReferences se meus objetos estão vivos ou não.

Atualização 2

Depois de dormir um pouco e pensar um pouco mais, também fiz outra alteração no meu testador (responda abaixo) acabei de adicionar umGC.Collect() após a última linha e defina a duração como 10000. Após iniciar oBlinkText() pressionei várias vezes meu botão2 para obter o estado atual e forçar uma coleta de lixo. E como parece que todos os temporizadores serão destruídosdepois de chamando oStop() método. Também uma coleta de lixo enquanto meu BlinkText já está disponível e o cronômetro está em execução não causa problemas.

Então, depois de todas as suas boas respostas e um pouco mais de testes, posso dizer com satisfação que ele faz o que deveria, sem deixar temporizadores na memória nem jogar fora os cronômetros antes de realizarem seu trabalho.

questionAnswers(7)

yourAnswerToTheQuestion