Ich starte einen Datenimport durch Klick auf einen Button. Den Fortschritt zeige ich mit einer ProgressBar an.
Beim Import wird die ProgressBar durch den Befehl ProgressBar1.Refresh(); aktualisiert.
Wenn ich nun auf das Fenster klicke oder es mal im Hintergrund war wird es nicht mehr aktualisiert und das Fenster bekommt den Zusatz "(Keine Rückmeldung)".
Wie kann ich bewirken, dass die ProgressBar auch nach Mausklicks aktualisiert wird ?
Wie kann ich bewirken dass ich den Vorgang durch Klick auf einen Button abbrechen kann ?
Wenn ich vor dem Import die Dateien leere mit einem SQL-Befehl dann dauert dass eine Weile. Kann ich in dieser Zeit auch was anzeigen bzw. Abbrechen ermöglichen ?
Fragen über Fragen 😉
Grüße Bernd
Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3
Last in einen Thread auslagern....
Vorsicht Zugriffe auf das UI dann marshallen
Boardsuche: Thread / Invoke / InvokeRequired
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
Das hab ich befürchtet, das man da was mit Threads machen muss.
😉
Dann werde ich mich mal damit beschäftigen.
Danke für die Infos und einen schönen Tag noch,
Bernd
Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3
Bei der Suche nach den genannten Suchworten hab ich festgestellt dass wohl jeder mal dieses Problem hat 😉
Ich habe 3 Beispiele zu BackgroundWorker gefunden, die werde ich mir mal anschauen und dann probieren ob ich das damit hinkriege :
http://www.stim.de/index.php?id=185
Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3
Für meine Anforderung habe ich eine einfache Lösung gefunden :
Application.DoEvents();
in der Hauptschleife genügt, da ein einzelner Import recht schnell geht. Es können nur einige Tausend bis Millionen Datensätze sein.
ProgressBar und Abbruch-Button funktionieren wunderbar.
Die BackgroundWorker hab ich mit trotzdem angesehen weil ich sie für andere Sachen brauchen werde.
Grüße Bernd
Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3
Hallo BerndFfm
Original von BerndFfm
Für meine Anforderung habe ich eine einfache Lösung gefunden :Application.DoEvents(); Es gibt soviele Threads hier über Invoke/BeginInvoke/InvokeRequired, jedoch wird trotzdem immer wieder DoEvents() verwendet. Sorry, klingt jetzt vieleicht hart, aber das ist eine schlechte Lösung.
in der Hauptschleife genügt, da ein einzelner Import recht schnell geht. Es können nur einige Tausend bis Millionen Datensätze sein. Du widersprichst dich 😉 eine Million halte ich für eine recht grosse Zahl =)
Die BackgroundWorker hab ich mit trotzdem angesehen weil ich sie für andere Sachen brauchen werde. Den Sinn dieser Klasse habe ich noch nicht erkannt. Was diese Klasse kann, kann man ebenso einfach mit Threads lösen und braucht dazu noch weniger Code.
Gruss,
.unreal
Hi Unreal,
in meinem Fall dauert der Import eines Datensatzes nur einen Bruchteil einer Sekunde, die Applikation kann also schnell genug auf alle Ereignisse reagieren.
Der gesamte Import dauert natürlich länger, das können schon einige Stunden sein.
BackgroundWorker sind wohl einfacher zu implementieren als Threads, obwohl sie ja fast das gleiche tun.
Und man kann sie im Designer aus der Toolbox auf die Applikation ziehen 😉
Das scheint wohl wichtig zu sein.
Es gibt noch genügend Anwendungen wo die Vorgänge länger dauern oder parallel ablaufen sollen und ich mich dann doch mit Threads beschäftigen muss, z.B. Emailversand an 100 Leute gleichzeitig (Newsletter), umfangreiche Datenbankabfragen oder Dateien kopieren.
Grüße Bernd
Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3
Wenn ich das jetzt richtig gsehen habe ist das für VS05 gibt es da auch was für VS03???
@.unreal
da ich auch viel mit threads arbeite war ich dem neuen backgroundworker gegenüber auch kritisch. ich hab ihn mir dann mal angesehen und muss sagen das er sehr gut funktioniert! wenn man ihn per drag and drop auf das formular zieht hat man kaum schreib arbeit. nur dowork implementieren und reportprogress aufrufen. die funktion für das progress updaten is threadsicher und es wird kein invoke beöntigt, also ein thread für anfäner! ich finds gut, benutze aber weiterhin herkömmliche threads!
lowrider : BackgoundWorker gibt es erst in VS 2005.
Threads und Application.DoEvents() gibt es natürlich schon in VS 2003.
Grüße Bernd
Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3
wenn man ihn per drag and drop auf das formular zieht hat man kaum schreib arbeit. nur dowork implementieren und reportprogress aufrufen.
Mir gefällt dieses Drag&Drop programmieren einfach nicht 🙂 Einen Thread zu starten sind 2 Zeilen code, geht mindestens so fix 😉. Das ist und bleibt geschmackssache.
Trotzdem wäre Backgroundworker sicher eine viel bessere Lösung als Application.DoEvents().
Gruss,
.unreal