Autor Beitrag
Marmelade
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39

Windows XP, Windows7 Ultimate
C#
BeitragVerfasst: Mi 15.04.09 16:32 
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:
ausblenden volle Höhe 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;
                
                //ping senden
                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 user profile iconKha: Topic aus Netzwerk verschoben am Mi 15.04.2009 um 17:14


Zuletzt bearbeitet von Marmelade am Mi 15.04.09 20:14, insgesamt 2-mal bearbeitet
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39

Windows XP, Windows7 Ultimate
C#
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mi 15.04.09 20:21 
user profile iconMarmelade hat folgendes geschrieben Zum zitierten Posting springen:
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: ?
user profile iconMarmelade hat folgendes geschrieben Zum zitierten Posting springen:
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.

_________________
>λ=