This post originated from an RSS feed registered with .NET Buzz
by -.
Original Post: Meine GUI friert w��hrend der Ausf��hrung ein, was tun?
Feed Title: Norbert Eder - Living .NET
Feed URL: http://feeds.feedburner.com/NorbertEder-Livingnet
Feed Description: Copyright (c)2005, 2006 by Norbert Eder
Ebenfalls eine oft gesehene Frage. Eine Aufgabe wird gerade ausgef��hrt und dabei friert die Oberfl��che der Anwendung ein. Weder ein Fortschrittsbalken wird aktualisiert, noch ein Label, das den Fortschritt anzeigt. Ja selbst beim Verschieben der Form wird diese wei�� und zeigt keine Informationen mehr an.
Der Hintergrund liegt einfach daran, dass durch eine ausgef��hrte Arbeit von dieser Form keine System-Message mehr angenommen wird bzw. diese nicht verarbeitet werden kann. Um dies zu vermeiden (und damit der Benutzer nicht irrt��mlich annimmt, die Anwendung sei abgest��rzt), bieten sich mehrere L��sungen an:
DoEvents Durch ein Application.DoEvents() erh��lt die Anwendung die M��glichkeit, andere Events abzuhandeln und die Form neu zu zeichnen.
Threading Aufw��ndige Aufgaben sollten in einem eigenen Thread ausgef��hrt werden. Dies kann ��ber die Klassen des Namespaces System.Threading geschehen oder ��ber einen BackgroundWorker. Hier ist jedoch zu beachten, dass von Threads nicht direkt auf die GUI-Elemente zugegriffen werden kann. Hierzu muss mit Invoke gearbeitet werden.
Wichtig: Locking In manchen F��llen ist es wichtig, bestimmte Code-Teile mit einem lock (oder anderen entsprechenden Blockierungs-Ma��nahmen) zu versehen. Dadurch kann der gleiche Code nur von einem einzigen Thread aufgerufen und ausgef��hrt werden. Dies kann mit einem DoEvents nicht ausreichend gel��st werden. In solchen F��llen sollte auf jeden Fall Threading verwendet werden.