Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
invoke und eventproblem

Moderationshinweis von herbivore (24.03.2011 - 14:51:07):

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!

Gelöschter Benutzer

invoke und eventproblem

beantworten | zitieren | melden

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;
Friedel
myCSharp.de - Member

Avatar #avatar-1931.jpg


Dabei seit:
Beiträge: 831
Herkunft: Nähe Kassel / Hessen

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Gelöschter Benutzer

beantworten | zitieren | melden

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)
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal am .