C# cpu auslastung

ich hab ein problem mit meinem email client. wenn ich eine grössere menge von emails abrufe, dann geht mein programm in einen status über, wo das fenster nicht mehr richtig funktioniert. also ob der windows explorer auf (keine rückmeldung) geht zum Beispiel. meine cpu auslastung steigt hier auf 100%. weiss jemand wie ich das verhindern kann. mein programm besteht aus einen hauptfenster und auch bei email abrufen ist die progressbar in das hauptfenster integriert. und ich möchte dass dieses fenster weiterhin normal reagiert auf benutzereingaben. ich hab bisher nur mit java gearbeitet. wie kann ich das problem mit c# beheben?

danke schon mal für die antwort.
mfg, martin

Hi!

Die Lösung ist - wie auch in Java oder sonstwo - z.B. Multithreading.
In einer typischen .NET Windows Forms Anwendung gibt es einen Thread, der sich um die Aktualisierung der Oberfläche kümmert. Wenn Du dann z.B. in der Ereignisbehandlungsroutine eines Knopfes länger dauernde Aktionen durchführst, dann wird die Oberfläche so lange nicht reagieren, bis die Ereignisbehandlungsroutine fertig ist.
Wenn es Dir aber auch während solcher Zeiten um ein reagierendes GUI geht, dann könntest Du z.B. die Aktion in einem eigenen Thread ablaufen lassen. Das Aufsetzen des Threads selber ist schnell passiert (und unter .NET auch nicht mehr wirklich schwer, schau’ mal in der Online-Hilfe zum Thema ThreadPool nach) und die GUI bleibt aktiv, während der andere Thread werkelt.
Der einzige kleine Stolperstein ist noch die Aktualisierung von Controls aus einem anderen Thread heraus, wobei man dann über Invoke() (bzw. BeginInvoke() u.ä.) arbeiten muss.

Eine andere Möglichkeit, wenn Du z.B. in einer längeren Schleife etwas machst, wäre der Aufruf an Application.DoEvents(). Damit werden alle noch in der Nachrichtenwarteschlange sthenden Nachrichten abgearbeitet (z.B. Zeichenbefehle, aber auch Behandlung von Mausklicks) und die Oberfläche erscheint ebenfalls noch zu reagieren. Dann sollte man aber darauf achten, dass auch nur die Controls aktiviert sind, die auch tatsächlich auch während der Durchführung der länger dauernden Aktion bedient werden sollen.

Martin

ah, ok
danke für die exakte hilfe. mal sehen ob ich das mit dem thread hinbekomme. scheint mir effizienter zu sein als die doEvent möglichkeit.

also auf jeden fall nochmal danke für die hilfe

mfg, martin