Entwickler-Ecke
WinForms - BackgroundWorker: Problem mit ProgressChanged
Marmelade - Mi 15.04.09 16:32
Titel: BackgroundWorker: Problem mit ProgressChanged
Moin,
Ich bin grade frisch nach C# gekommen und wollte jetzt ein programm schreiben, welches mir alle aktiven Geräte im netzwerk in eine ListBox ausgibt. Das funktioniert auch nur wollte ich das ganze jetzt mit nem BackgroundWorker machen und da kommt beim ausführen immer:
"Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde."
Ich hab kp was ich falsch mache.
Hier mein code:
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: 49:
| private void button1_Click(object sender, EventArgs e) {
this.backgroundWorker1.RunWorkerAsync(); }
private void scan() { Ping pingSender = new Ping(); PingOptions options = new PingOptions();
options.DontFragment = true;
this.ping_progressbar1.Maximum = 255; this.ping_progressbar1.Step = 1;
for (int id = 0; id < 255; id++) { string aktip; string netz; string data; string idstr; int tout = 120;
netz = "192.168.178."; aktip = netz + id.ToString(); data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
this.ping_progressbar1.Value = id; byte[] buffer = Encoding.ASCII.GetBytes(data); PingReply reply = pingSender.Send(aktip, tout, buffer, options);
if (reply.Status == IPStatus.Success) { this.listBox1.Items.Add(aktip); } } }
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { scan(); } |
Moderiert von
Kha: Topic aus Netzwerk verschoben am Mi 15.04.2009 um 17:14
Kha - Mi 15.04.09 17:17
:welcome:
Ich verschiebe mal, da es ja um den BackgroundWorker geht. Den Titel könntest du auch noch entsprechend anpassen.
Schau dir nochmal die Hilfe zu der Klasse an, besonders das Beispiel:
Zitat: |
You must be careful not to manipulate any user-interface objects in your DoWork event handler. Instead, communicate to the user interface through the ProgressChanged and RunWorkerCompleted events. |
In scan musst du also ReportProgress benutzen, im ProgressChanged-Handler kannst du dann die ListBox aktualisieren.
Marmelade - Mi 15.04.09 19:25
Hey,
Danke für deine schnelle Antwort.
Hab mir jetzt mal BackgroundWorker.ReportProgress angesehen, allerdings versteh ich das nicht so ganz, was das mit der Prozentangabe soll. Kann mir das vielleicht Jemand genauer erklären. Wär echt nett.
Und wie kann ich dann in ProgressChanged auf die Variablen in Scan() zugreifen?
Kha - Mi 15.04.09 20:21
Marmelade hat folgendes geschrieben : |
Hab mir jetzt mal BackgroundWorker.ReportProgress angesehen, allerdings versteh ich das nicht so ganz, was das mit der Prozentangabe soll. |
Falls du sie nicht brauchst, ignorier sie einfach. Aber du hast doch sogar deine ping_progressbar :gruebel: ?
Marmelade hat folgendes geschrieben : |
Und wie kann ich dann in ProgressChanged auf die Variablen in Scan() zugreifen? |
Was du ReportProgress als zweiten Parameter übergibst, bekommst du in ProgressChanged in
e.UserState zurück.
Ehrlich gesagt ist das dann langsam einer der Fälle, in dem der BackgroundWorker keine großen Vorteile ggü. direktem Arbeiten mit dem Thread-Pool bietet.
PS: Die Initialisierung der ProgressBar muss dann logischerweise auch aus scan raus, also vor oder hinter RunWorkerAsync.
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!