Lambdas innerhalb der Erweiterungsmethoden: Möglicher Speicherverlust?

Ich habe gerade eine Antwort auf ein @ gegeb ganz einfache Frage mithilfe einer Erweiterungsmethode. Aber nachdem ich es aufgeschrieben hatte, erinnerte ich mich, dass man ein Lambda nicht von einem Event-Handler abbestellen kann.

Soweit kein großes problem. Aber wie verhält sich das alles innerhalb einer Erweiterungsmethode ??

Below ist mein Code wieder geschnippt. Kann mich also jemand aufklären, ob dies dazu führt, dass unzählige Timer im Speicher hängen bleiben, wenn Sie diese Erweiterungsmethode mehrmals aufrufen?

Ich würde nein sagen, da der Umfang des Timers innerhalb dieser Funktion begrenzt ist. Nach dem Verlassen hat also niemand einen Verweis auf dieses Objekt. Ich bin nur ein bisschen unsicher, weil wir hier in einer statischen Funktion in einer statischen Klasse sind.

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;
    }
}
Aktualisiere

Nur um zu klären, ich habe System.Windows.Forms.Timer. Aus Ihren Antworten geht hervor, dass gerade die Verwendung dieser Timer-Klasse die richtige Wahl war, da sie alles so macht, wie ich es in diesem Fall erwarten würde. Wenn Sie in diesem Fall eine andere Timer-Klasse ausprobieren, können Sie als @ auf Probleme stoßeMatthew fand heraus,. Auch icheinen Weg gefunde durch die Nutzung WeakReferences ob meine Objekte am Leben bleiben oder nicht.

Update 2

achdem ich ein wenig geschlafen und ein wenig nachgedacht hatte, nahm ich auch eine weitere Änderung an meinem Tester vor answer below) Ich habe gerade ein @ hinzugefüGC.Collect() nach der letzten Zeile und stellen Sie die Dauer auf 10000 ein. Nach dem Starten desBlinkText() Mehrmals habe ich die ganze Zeit meine Taste2 gedrückt, um den aktuellen Status abzurufen und eine Speicherbereinigung zu erzwingen. Und wie es scheint, werden alle Timer zerstörtnac Aufruf derStop() Methode. Also auch eine Garbage Collection, während mein BlinkText schon übrig ist und der Timer läuft, führt zu keinen Problemen.

So nach all Ihren guten Antworten und ein wenig mehr Tests kann ich glücklich sagen, dass es einfach das tut, was es sollte, ohne Timer im Speicher zu belassen oder die Timer wegzuwerfen, bevor sie ihre Arbeit erledigen.

Antworten auf die Frage(7)

Ihre Antwort auf die Frage