2010-11-04 16 views
1

MISE À JOUR: Le temporisateur est un temporisateur System.Threading.Compact Framework: Timer.Dispose ne bloque pas

Nous avons un contrôle de l'interface utilisateur qui est mis à jour sur Tick Timer. Sur la disposition de notre contrôle, nous appelons timer.Dispose(). Nous rencontrons occasionnellement ObjectDisposedOExceptions lorsque le temporisateur se déclenche après que le contrôle de l'interface utilisateur a été appelé.

Je vois cela dans l'msdn docs. Vous pouvez utiliser la méthode Dispose la surcharge de la méthode

« Callbacks peut se produire après la méthode Dispose() a été appelé, parce que les callbacks files d'attente de minuterie pour l'exécution par des fils de pool de threads (WaitHandle) surcharge de méthode pour attendre que tous les rappels soient terminés. " Toutefois, le Compact Framework n'a pas accès à cette méthode surchargée.

Quelle est la meilleure solution pour cette situation? Existe-t-il un moyen de rendre notre méthode Dispose jusqu'à ce que la minuterie ait été complètement éliminée? D'autres suggestions?

Merci!

Répondre

0

Je ne suis pas sûr que ce serait une bonne idée de bloquer sur Dispose. Il y a un certain nombre de choses qui pourraient mal tourner et qui pourraient laisser les choses dans un état sale.

Je voudrais plutôt vérifier que le contrôle est nul sur votre rappel de minuterie. Sinon, vous pouvez mettre votre callback dans un bloc try et attraper ObjectDisposedException mais cela consomme beaucoup plus de ressources (le lancement/attrape d'exception est très cher.)

Ceci devrait seulement arriver jusqu'à ce que les threads dans le pool de threads soient épuisés et il semble qu'il n'y ait pas de réel problème si la minuterie signale quelques fois mais ne fait aucun travail car le contrôle est nul.

+0

Nous avons essayé de vérifier si le contrôle était disposé sur rappel. Cela n'a pas aidé - le mieux que nous puissions dire au contrôle a été disposé alors que nous étions réellement dans la méthode de rappel. – Steve