2009-07-29 4 views
1

J'ai une classe simple avec deux variables et une fonction Close appelée OnTimerTick. Dans de très rares occasions, une exception NullReferenceException se produit dans la fonction Close(), mais je ne parviens pas à comprendre quelles peuvent être ces occasions. Quelqu'un peut-il expliquer?NullReferenceException survenant dans l'événement de graduation System.Windows.Forms.Timer

System.Windows.Forms.Timer timer = new Timer(); 
//timer.Tick is wired up in Constructor to OnTimerTick 

private void OnTimerTick(object sender, EventArgs e) 
{ 
    timer.Tick -= OnTimerTick; 
    Close(); 
} 

private void Close() 
{ 
    if (varOne != null) 
    { 
     varOne.SomeEvent -= onSomeEvent; 
     varOne.Dispose(); 
     varOne = null; 
    } 

    if (varTwo != null) 
    { 
     varTwo.AnotherEvent -= onAnotherEvent; 
     varTwo.Dispose(); 
     varTwo = null; 
    } 
} 
+0

Cela dépend probablement beaucoup de ce que varOne et varTwo sont. –

+0

Vous ne voyez pas dans le débogueur sur quelle ligne l'exception se produit? –

+0

@monkey_p Je ne l'ai jamais rencontré lors d'une session de débogage. – Raminder

Répondre

1

En supposant qu'aucun autre fils mutent vos variables, et en supposant que onSomeEvent et onAnotherEvent sont sur l'instance actuelle (aucune chance de là référence null), alors peut-être la chose la plus probable est que Dispose() jette ?

Ceci est possible - typiquement dans un état d'erreur (en effet, cela affecte le WCF); essayez d'envelopper le jeter.

Oh; Je suppose également ici que varTwo a des gestionnaires d'événements simples; il est également entièrement possible pour un événement de désinscription à l'échec; par exemple, si elle utilise un EventHandlerList et a déjà jeté loin ...

Donc, mettre les ensemble, quelque chose comme:

// very paranoid cleanup 
try {varOne.SomeEvent -= onSomeEvent; } 
catch (Exception ex) { Trace.WriteLine(ex); } // best endeavours... 
try { varOne.Dispose(); } 
catch (Exception ex) { Trace.WriteLine(ex); } // best endeavours... 

Normalement, ce type de paranoïa n'est pas nécessaire; mais parfois c'est.

+0

Eh bien, la trace de la pile montre que la fonction Close se lève. Si c'était Dispose ou l'événement se désabonnant qui a jeté alors ne devrait pas refléter dans la trace de pile. – Raminder

+0

Les traces de pile peuvent mentir. Surtout en version avec des optimisations telles que (JIT) inlining. –

+0

Eh bien, la trace de la pile était dans mon cas. – Raminder

Questions connexes