Nicht vergessen: Idle-Handler entfernen


Thomas Wölfer
Thomas Wölfer

20. September 2004


Wenn man in einer Dialogbox (Form) das UI updaten will, dann bietet sich dafür ein Idle-Handler an: In dem kann man prima Buttons disablen, Texte setzen und ähnliches tun. Den Handler installiert man ganz einfach nach InitializeComponent(), den Code dazu plaziert man einfach als private Methode in die Form:

Application.Idle += new EventHandler(Application_Idle);

Das Problem: Damit hat man der Anwendung einen neuen Idle-Handler zugewiesen - und was man dabei leicht vergisst: Der verschwindet natürlich nicht von selbst, nur weil man das Fenster schliesst. Resultat: Die Anwendung hat einen Zeiger auf den Idle-Hander, der Idle-Handler befindet sich in der Form - und die Form wird deshalb nie Disposed(). Einer der bösen Fälle wie man mal so eben auf die schnelle mit .Net ein Speicherleck erzeugt.

Lösung: Man merkt sich den Idlehandler in einer privaten Variable und trennt sich in Form.Closing() oder Form.Closed() wieder von der Anwendung ab.

// Init ....
idleHandler =
new EventHandler(Application_Idle);
Application.Idle += idleHandler;

// Closed ...
Application.Idle -= idleHandler;

Morgen: Wieder etwas über unsere Statikprogramme.