Dies ist ein Thread, auf den aus der FAQ verwiesen wird. Bitte keine weitere Diskussion, sondern nur wichtige Ergänzungen und diese bitte knapp und präzise. Vielen Dank!
ich bin gerade dabei mir eine klassenbibliothek zu erstellen, welches mir den asynchronen einsatz von tcp_ip ermöglicht.
alles funktioniert bis auf die tatsache, das wenn ich ein event in der klasse auslöse, das dann der fehler:
Cross-thread operation not valid: Control 'Form1' accessed from a thread other than the thread it was created on.
auftaucht.
dank forumssuche weiß ich jetzt das ich da mit invoke ranmuss.
jedoch weiß ich nicht wirklich wie, da die klasse in dem das event ausgelöst wird eine andere ist als die klasse die die werte benötigt.
ein beispiel:
private Tcp_Ip_Server server;
private Tcp_Ip_client client;
private void Form1_Load(object sender, EventArgs e)
{
server = new Tcp_Ip_Server();
server.start_listening("20000");
server.Empfange_Daten += new Tcp_Ip_Server.Daten_Event(this.daten_da);
client = new Tcp_Ip_client();
client.connect_to("127.0.0.1","20000");
}
private void daten_da(object sender,daten_eventargs e)
{
this.Text = "server: " + e.message;
}
private void button1_Click(object sender, EventArgs e)
{
client.send("test1");
}
und hier ein ausschnitt aus der tcp_ip klasse mit dem eventhandler
private string letzte_daten = "";
public string str
{
set
{
letzte_daten = value;
daten_eventargs e = new daten_eventargs(value);
Empfange_Daten(this, e);
}
get
{
return letzte_daten;
}
}
public delegate void Daten_Event(object sender, daten_eventargs e);
public event Daten_Event Empfange_Daten;
Hallo JAck30lena,
eventuell sollte das helfen:
private delegate void setTextAsyncDelegate(string message);
private void setTextAsync(string message)
{
if(this.InvokeRequired)
this.Invoke(new setTextAsyncDelegate(setTextAsync), new object[]{message});
else
this.Text = "server: " + message;
}
private void daten_da(object sender,daten_eventargs e)
{
setTextAsync();
}
Ps.: evtl. nicht fehlerfrei, da ohne VS verfasst.
Gruss
Friedel
Ohne Ziel ist auch der Weg egal.
achso.. jetzt habe ich es endlich verstanden..
vielen dank
edit: fehler im beispielcode korrigiert:
private delegate void setTextAsyncDelegate(string message);
private void setTextAsync(string message)
{
if(this.InvokeRequired)
this.Invoke(new setTextAsyncDelegate(setTextAsync), new object[]{message});
else
this.Text = "server: " + message;
}
private void daten_da(object sender,daten_eventargs e)
{
setTextAsync(e.Message);
}
(der übergabeparameter war nicht gesetzt)