Benutzer mit den meisten Antworten
Windows.Forms Multithreading (BeginInvoke)

Frage
-
Hi all
I have a little problem with threading in Windows.Forms.
I have a form, this form is basicaly loaded withing 0.2 seconds.
Now I have some methods for filling some controls in the form.
These methods take about 3 seconds to run.
These methods are called with different threads (lowest priority)
and of corse delegates and BeginInvoke.
What I see now is:
The form events (Shown and Activated) are finished in about 0.2 seconds,
but the form is still blocked for I guess this 3 seconds to run the methods.
I start the threads in the Form.Activated Event.
What am I doing wrong ?
What do I have to change to get the form free ?
Thanks for any answers and best regards
Frank Uray
Antworten
-
Hallo Frank Uray,
ja, BeginInvoke wird immer leicht als komplett asynchron gedeutet, aber BeginInvoke blockiert (wartet) ggf. auch, wenn der Haupt-Thread beschäftigt ist!
[Bearbeiten von Steuerelementen aus Threads]
http://dzaebel.net/ControlInvoke.htm
Normalerweise benutzt man dann Methoden wie:[Nutzung grosser Datenmengen beim DataGridView]
http://dzaebel.net/DgvVirtual.htmum nicht alle Daten in einem Rutsch laden zu müssen.
Das käme dann auf die Art Deiner Steuerelemente und Laderoutinen an.
ciao Frank- Als Antwort markiert Robert BreitenhoferModerator Freitag, 17. September 2010 16:05
-
Hi Frank
Danke für Dein Feedback.
Konnte es nun wie folgt lösen:this.BeginInvoke((System.Windows.Forms.MethodInvoker)delegate { SomeMethod(); });
Zudem habe ich noch am Schluss der jeweiligen Methoden ein .Refresh() des entsprechenden Controls hinzugefügt.
Nun ist das Form sofort verfügbar und die Controls aktualisieren sich sobald die entsprechenden Daten geladen sind.
Gruss
Frank Uray- Bearbeitet Robert BreitenhoferModerator Freitag, 17. September 2010 16:04 Formatierung
- Als Antwort markiert Robert BreitenhoferModerator Freitag, 17. September 2010 16:04
Alle Antworten
-
> methods for filling some controls in the form.
> These methods take about 3 seconds to run.
Hallo Frank (german forum)
Nur der eigentliche, direkte Zugriff auf die Controls muss via Invoke/BeginInvoke im GUI-Thread stattfinden.
Du musst also untersuchen, welche deiner 'langsamen' Methoden man so in Threads verlagern kann,
wo dann nur die 'Rohdaten' (wie zB eine langsame Datenbankabfrage) aufbereitet werden,
und die 'fertigen' Daten dann via BeginInvoke an den GUI Thread übergeben.
Falls wirklich das direkte auffüllen von Controls (zB riesige TreeViews) diese Zeit braucht,
gibt es bei einigen Controls andere ('virtuelle') Ansätze, damit zB nur die aktuell gerade 'sichtbaren' Elemente eingetragen werden müssen. -
Hallo Frank Uray,
ja, BeginInvoke wird immer leicht als komplett asynchron gedeutet, aber BeginInvoke blockiert (wartet) ggf. auch, wenn der Haupt-Thread beschäftigt ist!
[Bearbeiten von Steuerelementen aus Threads]
http://dzaebel.net/ControlInvoke.htm
Normalerweise benutzt man dann Methoden wie:[Nutzung grosser Datenmengen beim DataGridView]
http://dzaebel.net/DgvVirtual.htmum nicht alle Daten in einem Rutsch laden zu müssen.
Das käme dann auf die Art Deiner Steuerelemente und Laderoutinen an.
ciao Frank- Als Antwort markiert Robert BreitenhoferModerator Freitag, 17. September 2010 16:05
-
Hi Frank
Danke für Dein Feedback.
Konnte es nun wie folgt lösen:this.BeginInvoke((System.Windows.Forms.MethodInvoker)delegate { SomeMethod(); });
Zudem habe ich noch am Schluss der jeweiligen Methoden ein .Refresh() des entsprechenden Controls hinzugefügt.
Nun ist das Form sofort verfügbar und die Controls aktualisieren sich sobald die entsprechenden Daten geladen sind.
Gruss
Frank Uray- Bearbeitet Robert BreitenhoferModerator Freitag, 17. September 2010 16:04 Formatierung
- Als Antwort markiert Robert BreitenhoferModerator Freitag, 17. September 2010 16:04
-
Hallo Frank Uray,
Schön dass Refresh() Dein Problem mit BeginInvoke() löst, aber warum?
Kann es sein, dass die Handles Deiner Controls zum Zeitpunkt von BeginInvoke noch nicht erstellt wurden?
Verwendest Du vielleicht für das Fenster ShowInTaskbar = false ?Gruß
Marcel