Hallo zusammen,
danke, so sehe ich das auch. :-)
Und dort steht zu lesen:
Zitat von herbivore aus "FAQ: Controls von Thread aktualisieren lassen" |
In vielen Fällen kann man wählen, ob man Control.BeginInvoke oder Control.Invoke benutzt. Der Hauptunterschied ist, dass Invoke wartet, bis der GUI-Thread die Aktion ausgeführt hat, wogegen BeginInvoke den Arbeitsauftrag nur in die Nachrichtenschlange des GUI-Threads stellt und sofort zurückkehrt. Invoke arbeitet also (in vielen Fällen unnötig) synchron. Allerdings muss man bei Control.BeginInvoke jegliche erforderliche Synchronisation beim gleichzeitigen Zugriff auf dieselben Daten selbst realisieren.[...]
Control.BeginInvoke ist deutlich weniger teuer als Control.Invoke. Trotzdem sollte man mit Aufrufen von Control.BeginInvoke genauso sparsam sein, denn jeder Aufruf von Control.BeginInvoke stellt eine Nachricht in die Nachrichtenschlange des GUI-Threads. Wenn sich nun hintereinander soviele solcher Nachrichten in der Nachrichtenschlange angesammelt haben, dass deren Abarbeitung in der Summe länger 1/10s dauert, blockiert das GUI genauso, als wäre nur eine Nachricht eingestellt worden, deren Verarbeitung länger als 1/10s dauert. |
Es ist also keineswegs so, dass Control.BeginInvoke in jedem Fall besser ist als Control.Invoke, z.B. wenn sowieso gleichzeitige Zugriffe auf die gemeinsamen Daten verhindert werden müssen. Und es ist keineswegs so, dass man mit der Umstellung von Control.Invoke auf Control.BeginInvoke alle Probleme löst. Wenn sehr viele Events gefeuert werden, kann es nötig sein, diese ohne Control.Invoke/Control.BeginInvoke erstmal nur zu sammeln und das GUI regelmäßig per Timer zu aktualisieren.
Aber davon mal abgesehen ist der Vorschlag von FZelle eine erwägenswerte Alternative zu der Verwendung von Events. Events sind praktisch, keine Frage, aber ein Logging, das direkt oder per AOP in den eigentlichen Bearbeitungscode integriert ist, hat auch seine Vorteile. Insbesondere wenn man später das Ziel des Loggings ändern will und nicht mehr ins GUI, sondern z.B. in eine Datei - oder sagen wir über eine IPC-Verbindung in eine separate Anwendung, die die Meldungen anzeigt - geloggt werden soll, ist es gar nicht nötig bzw. sogar gar nicht wünschenswert, wenn das GUI involviert ist.
herbivore