C# BackgroundWorker

Ich bin gerade dabei ein Programm zuschreiben welches ein eine IP addresse einliest. Auf diese IP sollen 5 Ping geschickt werden. Nachdem Ersten Ping soll dem Benutzer Gezeigt werden (Mit einer TextBox die Rot oder Grün wird) ob der Ping erfolgreich war…dann soll der Zweite Ping ausgeführt werden und dann soll in der zweiten TextBox wieder angezeigt werden ob der Ping erfolgreich war…insgesamt gibt es 5pings mit 5 Textboxen…

Das Programm Funktioniert auch…ABER wenn ich es bewege bleibt das Programm hängen…

also habe ich mal rumgeguckt…und mir ist der BackgroundWorker ins augegefallen…

habe meine Pings in den BackgroundWorker eingefügt…

das Problem ist…die try catch funktion läuft solange bis was im fenster angezeigt werden soll…also bis zum ersten ping wo er dann grün bzw. rot werden soll…dann bricht sie ab und geht in die catch funktion.

hier mal mein code

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net.NetworkInformation;

namespace PingTool
{
 public partial class Form1 : Form
 {
 String add\_1 = "";
 String status1 = "ok";

 long p1\_1, p1\_2, p1\_3, p1\_4, p1\_5, p1\_g;

 int sleeptime = 2000;
 int maxtime = 50;

 BackgroundWorker bw = new BackgroundWorker();


 public Form1()
 {
 InitializeComponent();

 bw.WorkerSupportsCancellation = true;
 bw.WorkerReportsProgress = true;
 bw.DoWork +=
 new DoWorkEventHandler(bw\_DoWork);
 bw.ProgressChanged +=new ProgressChangedEventHandler(bw\_ProgressChanged);
 bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw\_RunWorkerCompleted);
 }
 public void ping1()
 {
 if (checkBox1.Checked == true)
 {


 add\_1 = textBox1.Text;

 try
 {
 int errorcunt1 = 0;

 Ping p1 = new Ping();
 PingOptions po1 = new PingOptions();

 //PingReply pingReply1 = p1.Send(add\_1);

 ad\_p1\_1.BackColor = Color.White;
 ad\_p1\_1.Text = "";
 // this.Refresh();
 PingReply pingReply1\_1 = p1.Send(add\_1);

 p1\_1 = pingReply1\_1.RoundtripTime;
 if (pingReply1\_1.Status.ToString() != "Success")
 {
 errorcunt1++;
 ad\_p1\_1.BackColor = Color.Red;
 ad\_p1\_1.Text = "-";

 ad\_p1\_u.Text = DateTime.Now.ToString();
 // this.Refresh();



 }
 else
 {
 ad\_p1\_1.BackColor = Color.Green;
 ad\_p1\_1.Text = p1\_1.ToString();
 ad\_p1\_u.Text = DateTime.Now.ToString();
 //this.Refresh();
 }



 ad\_p1\_2.BackColor = Color.White;
 ad\_p1\_2.Text = "";
 // this.Refresh();
 System.Threading.Thread.Sleep(sleeptime);
 PingReply pingReply1\_2 = p1.Send(add\_1);
 p1\_2 = pingReply1\_2.RoundtripTime;
 if (pingReply1\_2.Status.ToString() != "Success")
 {
 errorcunt1++;
 ad\_p1\_2.BackColor = Color.Red;
 ad\_p1\_2.Text = "-";
 ad\_p1\_u.Text = DateTime.Now.ToString();
 // this.Refresh();
 }
 else
 {
 ad\_p1\_2.BackColor = Color.Green;
 ad\_p1\_2.Text = p1\_2.ToString();
 ad\_p1\_u.Text = DateTime.Now.ToString();
 // this.Refresh();
 }

 ad\_p1\_3.BackColor = Color.White;
 ad\_p1\_3.Text = "";
 // this.Refresh();
 System.Threading.Thread.Sleep(sleeptime);
 PingReply pingReply1\_3 = p1.Send(add\_1);
 p1\_3 = pingReply1\_3.RoundtripTime;
 if (pingReply1\_3.Status.ToString() != "Success")
 {
 errorcunt1++;
 ad\_p1\_3.BackColor = Color.Red;
 ad\_p1\_3.Text = "-";
 ad\_p1\_u.Text = DateTime.Now.ToString();
 // this.Refresh();
 }
 else
 {
 ad\_p1\_3.BackColor = Color.Green;
 ad\_p1\_3.Text = p1\_3.ToString();
 ad\_p1\_u.Text = DateTime.Now.ToString();
 // this.Refresh();
 }


 ad\_p1\_4.BackColor = Color.White;
 ad\_p1\_4.Text = "";
 //this.Refresh();
 System.Threading.Thread.Sleep(sleeptime);
 PingReply pingReply1\_4 = p1.Send(add\_1);
 p1\_4 = pingReply1\_4.RoundtripTime;
 if (pingReply1\_4.Status.ToString() != "Success")
 {
 errorcunt1++;
 ad\_p1\_4.BackColor = Color.Red;
 ad\_p1\_4.Text = "-";
 ad\_p1\_u.Text = DateTime.Now.ToString();
 // this.Refresh();
 }
 else
 {
 ad\_p1\_4.BackColor = Color.Green;
 ad\_p1\_4.Text = p1\_4.ToString();
 ad\_p1\_u.Text = DateTime.Now.ToString();
 //this.Refresh();
 }



 ad\_p1\_5.BackColor = Color.White;
 ad\_p1\_5.Text = "";
 //this.Refresh();
 System.Threading.Thread.Sleep(sleeptime);

 PingReply pingReply1\_5 = p1.Send(add\_1);
 p1\_5 = pingReply1\_5.RoundtripTime;
 if (pingReply1\_5.Status.ToString() != "Success")
 {
 errorcunt1++;
 ad\_p1\_5.BackColor = Color.Red;
 ad\_p1\_5.Text = "-";
 ad\_p1\_u.Text = DateTime.Now.ToString();
 // this.Refresh();
 }
 else
 {
 ad\_p1\_5.BackColor = Color.Green;
 ad\_p1\_5.Text = p1\_5.ToString();
 ad\_p1\_u.Text = DateTime.Now.ToString();
 //this.Refresh();
 }



 p1\_g = (p1\_1 + p1\_2 + p1\_3 + p1\_4 + p1\_5) / 5;

 if ((errorcunt1 =2) && (((p1\_g == 0) || p1\_g \>= maxtime)))
 {

 if (status1 == "ok")
 {


 System.Net.Mail.SmtpClient mail = new System.Net.Mail.SmtpClient();
 mail.Host = "IP";
 mail.Send("[email protected]", "[email protected]", "Fehlermeldung PingTool", "Die Adresse " + add\_1 + " hat eine Fehlermeldung! Bitte Überprüfen\nDurchschnittantwortzeit beträgt: " + p1\_g + "ms");

 status1 = "gesendet";
 }
 }
 }
 catch
 {
 if (status1 == "ok")
 {


 System.Net.Mail.SmtpClient mail = new System.Net.Mail.SmtpClient();
 mail.Host = "IP";
 mail.Send("[email protected]", "[email protected]", "Fehlermeldung PingTool", "Die Adresse " + add\_1 + " hat eine Fehlermeldung! Bitte Überprüfen\nDurchschnittantwortzeit beträgt: " + p1\_g + "ms");

 status1 = "gesendet";
 }
 }
 }
 }
 private void button1\_Click(object sender, EventArgs e)
 {
 if (bw.IsBusy != true)
 {
 bw.RunWorkerAsync();
 }
 }

 private void button2\_Click(object sender, EventArgs e)
 {
 if (bw.WorkerSupportsCancellation == true)
 {
 bw.CancelAsync();
 }


 }


private void bw\_DoWork(object sender, DoWorkEventArgs e)
 {
 BackgroundWorker worker = sender as BackgroundWorker;



 ping1();

 }

 public void bw\_ProgressChanged(object sender, ProgressChangedEventArgs e)
 {
 this.tbProgress.Text = (e.ProgressPercentage.ToString() + "%");


 }

 private void bw\_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
 {
 if ((e.Cancelled == true))
 {
 this.tbProgress.Text = "Canceled!";
 }

 else if (!(e.Error == null))
 {
 this.tbProgress.Text = ("Error: " + e.Error.Message);
 }

 else
 {
 this.tbProgress.Text = "Done!";
 }
 }

vllt kann mir ja jemand helfen…

vielen dank im vorraus

Single Thread Rule
NIEMALS darf ein Control von einem anderen Thread als dem GUI-Thread angesprochen werden!

Siehe „[FAQ] Warum blockiert mein GUI?“:
http://www.mycsharp.de/wbb2/thread.php?threadid=27992

und „[FAQ] Controls von Thread aktualisieren lassen (Control.Invoke)“:
http://www.mycsharp.de/wbb2/thread.php?threadid=33113

Grüße, JasonDelife.

Hi,
danke für deinen Tipp…Also ich hab den Backgroundworker wieder rausgemacht

namespace PingTool
{
 /// 
 /// Interaktionslogik für Window1.xaml
 /// 
 public partial class Window1 : Window
 {
 String add\_1 = "";
 String status1 = "ok";

 long p1\_1, p1\_2, p1\_3, p1\_4, p1\_5, p1\_g;


 int sleeptime = 2000;
 int maxtime = 50;




 public Window1()
 {
 InitializeComponent();


 }

 private void bnt\_Close\_Click(object sender, RoutedEventArgs e)
 {
 this.Close();
 }

 public void ping1()
 {

 if (checkBox1.IsChecked == true)
 {

 add\_1 = textBox1.Text;

 try
 {
 int errorcunt1 = 0;

 Ping p1 = new Ping();
 PingOptions po1 = new PingOptions();

 //PingReply pingReply1 = p1.Send(add\_1);

 ad\_p1\_1.Background = Brushes.White;
 ad\_p1\_1.Text = "";

 this.Show();
 PingReply pingReply1\_1 = p1.Send(add\_1);
 p1\_1 = pingReply1\_1.RoundtripTime;
 if (pingReply1\_1.Status.ToString() != "Success")
 {
 errorcunt1++;
 ad\_p1\_1.Background = Brushes.Red;
 ad\_p1\_1.Text = "-";

 ad\_p1\_u.Text = DateTime.Now.ToString();
 // this.Refresh();

 this.UpdateLayout();

 }
 else
 {
 ad\_p1\_1.Background = Brushes.Green;
 ad\_p1\_1.Text = p1\_1.ToString();
 ad\_p1\_u.Text = DateTime.Now.ToString();
 // this.Refresh();

 }



 ad\_p1\_2.Background = Brushes.White;
 ad\_p1\_2.Text = "";
 //this.Refresh();
 System.Threading.Thread.Sleep(sleeptime);
 PingReply pingReply1\_2 = p1.Send(add\_1);
 p1\_2 = pingReply1\_2.RoundtripTime;
 if (pingReply1\_2.Status.ToString() != "Success")
 {
 errorcunt1++;
 ad\_p1\_2.Background = Brushes.Red;
 ad\_p1\_2.Text = "-";
 ad\_p1\_u.Text = DateTime.Now.ToString();
 // this.Refresh();
 }
 else
 {
 ad\_p1\_2.Background = Brushes.Green;
 ad\_p1\_2.Text = p1\_2.ToString();
 ad\_p1\_u.Text = DateTime.Now.ToString();
 //this.Refresh();
 }

 ad\_p1\_3.Background = Brushes.White;
 ad\_p1\_3.Text = "";
 //this.Refresh();
 System.Threading.Thread.Sleep(sleeptime);
 PingReply pingReply1\_3 = p1.Send(add\_1);
 p1\_3 = pingReply1\_3.RoundtripTime;
 if (pingReply1\_3.Status.ToString() != "Success")
 {
 errorcunt1++;
 ad\_p1\_3.Background = Brushes.Red;
 ad\_p1\_3.Text = "-";
 ad\_p1\_u.Text = DateTime.Now.ToString();
 // this.Refresh();
 }
 else
 {
 ad\_p1\_3.Background = Brushes.Green;
 ad\_p1\_3.Text = p1\_3.ToString();
 ad\_p1\_u.Text = DateTime.Now.ToString();
 //this.Refresh();
 }


 ad\_p1\_4.Background = Brushes.White;
 ad\_p1\_4.Text = "";
 //this.Refresh();
 System.Threading.Thread.Sleep(sleeptime);
 PingReply pingReply1\_4 = p1.Send(add\_1);
 p1\_4 = pingReply1\_4.RoundtripTime;
 if (pingReply1\_4.Status.ToString() != "Success")
 {
 errorcunt1++;
 ad\_p1\_4.Background = Brushes.Red;
 ad\_p1\_4.Text = "-";
 ad\_p1\_u.Text = DateTime.Now.ToString();
 // this.Refresh();
 }
 else
 {
 ad\_p1\_4.Background = Brushes.Green;
 ad\_p1\_4.Text = p1\_4.ToString();
 ad\_p1\_u.Text = DateTime.Now.ToString();
 //this.Refresh();
 }



 ad\_p1\_5.Background = Brushes.White;
 ad\_p1\_5.Text = "";
 //this.Refresh();
 System.Threading.Thread.Sleep(sleeptime);

 PingReply pingReply1\_5 = p1.Send(add\_1);
 p1\_5 = pingReply1\_5.RoundtripTime;
 if (pingReply1\_5.Status.ToString() != "Success")
 {
 errorcunt1++;
 ad\_p1\_1.Background = Brushes.Red;
 ad\_p1\_5.Text = "-";
 ad\_p1\_u.Text = DateTime.Now.ToString();
 // this.Refresh();
 }
 else
 {
 ad\_p1\_5.Background = Brushes.Green;
 ad\_p1\_5.Text = p1\_5.ToString();
 ad\_p1\_u.Text = DateTime.Now.ToString();
 //this.Refresh();
 }



 p1\_g = (p1\_1 + p1\_2 + p1\_3 + p1\_4 + p1\_5) / 5;

 if ((errorcunt1 = 2) && (((p1\_g == 0) || p1\_g \>= maxtime)))
 {

 if (status1 == "ok")
 {


 System.Net.Mail.SmtpClient mail = new System.Net.Mail.SmtpClient();
 mail.Host = "TEST";
 mail.Send("[email protected]", "[email protected]", "Fehlermeldung PingTool", "Die Adresse " + add\_1 + " hat eine Fehlermeldung! Bitte Überprüfen\nDurchschnittantwortzeit beträgt: " + p1\_g + "ms");

 status1 = "gesendet";
 }
 }
 }
 catch
 {
 if (status1 == "ok")
 {


 System.Net.Mail.SmtpClient mail = new System.Net.Mail.SmtpClient();
 mail.Host = "TEST";
 mail.Send("[email protected]", "[email protected]", "Fehlermeldung PingTool", "Die Adresse " + add\_1 + " hat eine Fehlermeldung! Bitte Überprüfen\nDurchschnittantwortzeit beträgt: " + p1\_g + "ms");

 status1 = "gesendet";
 }
 }
 }
 }


 public void bnt\_Start\_Click(object sender, RoutedEventArgs e)
 {



 Thread threadping1 = new Thread(new ThreadStart(ping1));

 threadping1.Start();

 MessageBox.Show("hallo");

 }
 }
}

Leider kommt direkt am anfang als der Thread auf die Textbox1 zugreifen möchte um die IP eingelesen hat direkt ein fehler…

woran liegt das?

Jetzt hast du einen Backroundworker durch eine Thread-Objekt ersetzt.

Das kommt aufs selbe raus.

Wie schon in der letzten Antwort…

niemals aus einem NICHT-GUI Thread auf ein Control zugreifen.
Es sei denn man nutzt invoke.
oder du liest vor dem thread.Start deine textboxen aus und schreibst sie in globale variablen.
der thread schreibt auch auf ne globale variable
und nachdem der thread fertig ist.
liest du die globale var aus

mfg

Hi!

Hi,
danke für deinen Tipp…Also ich hab den Backgroundworker
wieder rausgemacht

Wieso das denn?

[…]

Leider kommt direkt am anfang als der Thread auf die Textbox1
zugreifen möchte um die IP eingelesen hat direkt ein fehler…

woran liegt das?

Du schreibst jetzt zur Strafe 100 mal: „Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!“ :smile:

Dann überlegst Du Dir, wo die Textbox erzeugt wird und von wo aus Du darauf zugreifst…

Und dann liest Du Dir nochmal das FAQ durch.

Gruß,
Martin

Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"

Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"

Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"

Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"

Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"

Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"

Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"

Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"

Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"

Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"
Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"

Ich darf nicht auf ein Steuerelement aus einem anderen Thread zugreifen als aus dem, in dem es erzeugt wurde!"

sorry…ich hab trotzdem nicht verstanden was ich machen muss?..

könntest du mir das vllt zeigen?..

&&

wenn ich das erst nachdem Thread in die GUI einfügen würde…+

dann würde der mir ja nicht nachjedem PING die Textboxen fablich makieren…sondern nachdem Thread alle gleichzeitig?..

oder?

man :frowning:

versteh ich nicht :stuck_out_tongue:

ich kenn mich mit Programmieren noch nicht ganz so gut aus…mache das jetzt erst ein paar monate…

von daher wäre ich für ein paar tipps sehr dankbar…

c# BackgroundWorker mit invoke
Hi,

füge das unten ein und es geht.
Aber lies dir bitte dazu den passenden Teil in der MSDN durch, dass du weißt was das Invoke und der Delegat macht.

public void ping1()
{
if (this.InvokeRequired)
{
this.Invoke(new MethodInvoker(ping1));
return;
}
… //hier deinen Rest

Ach und in deiner Methode bw_DoWork kannst du das weglassen

BackgroundWorker worker = sender as BackgroundWorker;

Das benutzt du nicht.
Du nutzt den global deklarierten BackgroundWorker bw.

mfg
Martin

falls du das ergebnis nicht gleichzeitig sondern .
hi nochmal,

wenn du die 5 ergebnisse nacheinander angezeigt haben willst und nicht gleichzeitig am schluss mußt du 5 methoden machen.
ping1 bis ping5 und einen globalen integer dazu als zähler.

z.B. private int counter = 0;

dann das hier einfügen damit alle 5 methoden aufgerufen werden…

private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (counter ping2 machen.
Und eben die textboxnamen anpassen. ad_p1_1 -> ad_p1_2.

Ich kann dir auch die komplette Klasse posten.

mfg
Martin

hi…das hört sich jetzt richtig dreist an! aber könntest du mir wirklich mal die komplette klasse schicken?.. :smiley:

Programmieranfänger sollten erstmal die Finger von Threading lassen.
Das ist eines der komplexesten Themen überhaupt!

Falls du dennoch weitermachen willst:
Den BackgroundWorker kannst du trotzdem verwenden.
Threads werden gleichzeitig (ich vernachlässige Single-Core-CPUs jetzt mal) ausgeführt.
Controls (also Steuerelemente) werden NUR IN EINEM speziellen Thread erzeugt und geändert, dieser heißt GUI-Thread und wird bei aufruf von Application.Run(Form) erzeugt. Alle anderen threads dürfen AUF GAR KEINEN FALL auf Controls zugreifen bzw. diese verändern. Wenn man also in einem anderen thread als dem GUI-Thread auf ein Control zugreifen will, muss man quasi sagen: „Hallo GUI-Thread, bitte ändere du den Text von TextBox1 auf ‚Bla‘“. Das macht Control.(Begin)Invoke(Delegate). Invoke wartet bis der GUI-Thread damit fertig ist, BeginInvoke kehrt sofort zurück.

Ein Beispiel (stark gekürzt, benützt Lambda-Ausdrücke):

// public delegate Action(); ist in System definiert (.NET 3.5)

bgw\_DoWork() {
 for(int i = 0; i {
 TextBox1.Text += i + ": " + erg + Environment.NewLine;
 }));
 }
}

Grüße, JasonDelife.

WICHTIG: Ergänzung
Eigentlich brauchst du Cntrol.[Begin]Invoke(Delegate method) gar nicht.
Für das darstellen von Fortschritten in der GUI ist BackgroundWorker.ReportProgress(int percent[, object state]), BackgroundWorker.ReportsProgress (auf true) und das ProgressChanged-Ereignis, das autom. im GUI-Thread läuft.

Beispiel (nicht den konventionen folgend, geschweigedenn OOP, aber es zeigt die Arbeit mit dem BGW-Progressfeature):

class Data {
 public int i;
 public int value;
 public Data(int i, double value) { this.i = i; this.value = value; }
}

class Form1 : Form {
 bgw\_DoWork(object sender, DoWorkEventArgs e) {
 cont int max = 100000000;
 for(int i = 0; i 

Grüße, JasonDelife.