La minuterie ne sont pas éliminés lorsque le formulaire est

Je suis en train d'essayer de comprendre pourquoi un Windows.Forms.Timer ne sont pas éliminés lors de la form qui l'a créé. J'ai cette forme simple:

public partial class Form1 : Form {

    private System.Windows.Forms.Timer timer;

    public Form1() {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e) {
        timer = new Timer();
        timer.Interval = 1000;
        timer.Tick += new EventHandler(OnTimer);
        timer.Enabled = true;
    }

    private void OnTimer(Object source, EventArgs e) {
        Debug.WriteLine("OnTimer entered");
    }

    private void Form1_FormClosed(object sender, FormClosedEventArgs e) {
        this.Dispose();
    }
}

Quand je le ferme, this.Dispose est appelé, mais la minuterie de cuisson de l'événement continue à être appelé. Je pensais que le Dispose était de libérer tous les objets appartenant à l'objet supprimé. Est que faux? Ne Timer ont un comportement spécifique?

Pour l'instant, j'ai trouvé que la manière de disposer de la minuterie est de faire timer.Tick -= OnTimer; - je l'appelle ensuite dans le Form1_FormClosed événement. Est-ce la bonne solution ou dois-je faire autrement?

MODIFIER

Ou est-ce simplement de mieux à faire:

private void Form1_FormClosed(object sender, FormClosedEventArgs e) {
    timer.Dispose();
    this.Dispose();
}

?

L'élimination doit être réalisée dans le IDisposable méthode Dispose, pas dans FormClosing
dans FormClosing cas vous devriez arrêter la minuterie timer.Enabled = false; et puis timer.Dispose(); timer = null;
Comment est-il préférable de remplacer Dispose plutôt de le faire dans FormClosed?
Quelle est l'utilité de timer.Enabled = false; et timer = null; lorsque vous ne timer.Dispose();? N'est-ce pas Dispose() prendre soin de tout?
Déposer une minuterie à partir de la boîte à outils vers le formulaire avec le concepteur. Maintenant, il est tout automatique.

OriginalL'auteur Otiel | 2011-10-31