Entwickler-Ecke
WinForms - Backroundworker Update frage
Chiyoko - Sa 09.07.11 11:07
Titel: Backroundworker Update frage
Huhu,
ich hab mich spasseshalber doch weiter mit threads befasst, weil eine Progressbar in einem
anderen Projekt nicht updated, wenn über 20000 XML Zeilen ausgelesen werden.
Der folgende Prozess funktioniert, aber das Label wird nicht geupdated.
Woran könnte das liegen?
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) { for (int i = 0; i < 99; i++) { XDocument doc_de = XDocument.Parse(Properties.Resources.Text); int count_knoten = doc_de.XPathSelectElements("//mehrtext").Count();
backgroundWorker1.ReportProgress((i*100) / count_knoten); } Thread.Sleep(100); } private void backgroundWorker1_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e) { progbar.Value = e.ProgressPercentage; toolStripStatus_lbl_anzeige.Text = e.ProgressPercentage.ToString() + " %"; } private void backgroundWorker1_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e) { if (progbar.Maximum == progbar.Value) { progbar.Enabled = false; progbar.Value = 0; } } |
Th69 - Sa 09.07.11 11:30
Hallo,
hast du denn auch die Eigenschaft WorkerReportsProgress auf 'true' gesetzt?
Du solltest auch mal den Thread.Sleep() in die Schleife reinschreiben (evtl. geht der Vorgang ansonsten so schnell, daß du die Aktualisierung gar nicht mitbekommst ;-))
Chiyoko - Sa 09.07.11 11:54
Ja, ich habmir viele tutorials angeschaut, das hab ich nicht vergessen:D
Jetzt hab ich aber ein anderes problem,...
Die ersten Male funktionierte das mit der progressbar, jetzt allerdings
ist der backroundworker andauernd ausgelastet.
Wie kann das sein, er hat doch nur eine einzige Aufgabe???
Oppi35 - Sa 09.07.11 14:20
Hallo Chiyoko,
anbei ein kleines Testprogramm:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48:
| using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.ComponentModel;
namespace ConsoleApplication1 { class Program {
static void Main(string[] args) { BackgroundWorker back = new BackgroundWorker(); back.WorkerReportsProgress = true; back.DoWork += new DoWorkEventHandler(back_DoWork); back.ProgressChanged += new ProgressChangedEventHandler(back_ProgressChanged); back.RunWorkerCompleted += new RunWorkerCompletedEventHandler(back_RunWorkerCompleted); back.RunWorkerAsync(); Console.Read(); }
static void back_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { Console.WriteLine("FERTIG"); }
static void back_ProgressChanged(object sender, ProgressChangedEventArgs e) { Console.WriteLine(e.ProgressPercentage.ToString()+" Prozent"); }
static void back_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker b = sender as BackgroundWorker; Console.WriteLine("IN_DoWork"); for (int x = 0; x < 100; x++) { b.ReportProgress((x * 100) / 100); } } } } |
Zum einen muss Dein "Thread.Sleep" in der Schleife und nicht hinter der Schleife platziert werden.
Zum anderen ist mir bei meinem Testprogramm aufgefallen, dass die Zahlen von 1 bis 100 nicht in der korrekten Reihenfolge erscheinen, wenn ich das "Thread.Sleep(100)" weglasse.
Ich bin leider bzgl. Multi-Threading zu unerfahren, um Dir hier sichere Tips zu geben. Allerdings wäre mir ein Thread.Sleep zu unsicher. Woher weiß ich, welche Sleep-Dauer ich benötige, damit das Programm JEDES MAL richtig läuft.
Eine Art Thread.Join() müsste irgendwo hin, aber das sollte vielleicht nochmal jemand erläutern, der hier wirklich fit ist.
Gruß
Frank
Chiyoko - Sa 09.07.11 14:25
Danke für das beispiel,..ich arbeite mit Threads erst seit gestern.
Es ist ja auch nicht zwingend notwendig, aber berufsbezogen und
aus interesse wüsste ich das schon gerne, aber ich werd einfach weiter testen,
die antwort kommt dann sicher von alleine(wie immer:D)
Das mit thread.Sleep() ist in der Tat komisch aber logisch und Thread.Sleep(1) wäre ja sinnfrei.
Aber bei grossen Aufgaben sollte 1/100tel Sekunde kaum auffallen.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!