C# Problem mit Threading

cmprmsd

Lt. Commander
Registriert
Mai 2005
Beiträge
1.973
Huhu, ich habe ein WPF-C# projekt gestartet und stehe im Moment vor einem kleinem Problem.
Ein programmierter Socket-Server soll auf eine TCP-Verbindung auf einem festgelegten Port warten und bei Verbindung dies in einer Textbox mitteilen.

Da die Anwendung ohne Threads komplett blockieren würde, dachte ich mir das ganze in 2 Threads aufzuteilen wäre sinnvoll... Einer für die Oberfläche und einer für die Streams.
Allerdings gibts nun n Problem, da die Textbox nicht von dem zweitem Thread geändert werden kann, muss ich doch irgendwie einen anderen Weg gehen.
Nur wie? Kann man von dem zweitem Thread aus eine Funktion im ersten Thread aufrufen?
Zum Beispiel eine die sich LogIt nennen würde und die Parameter übergeben würden?

Ist das erste mal, dass ich mit c# arbeite, aber man kann ja schnell lernen =)
Ich wechsel von ehemals vb.net und mshell zu c# auf der Windows-Seite.
 
Zuletzt bearbeitet:
Danke ich schaue mir dazu mal dieses Beispiel an.. Melde mich dann wieder :D
 
Alle Userinterface Elemente dürfen nur vom Userinterface Thread verändert/abgefragt werden. Eine Möglichkeit: textbox.Invoke(...) oder textbox.BeginInvoke(...) führt ein Delegate im Userinterface Thread aus.

Invoke() blockiert den Rufer bis das Delegate ausgeführt wurde, BeginInvoke() blockiert nicht.
 
Hmm,
Ich habe nun mit public delegate void Delegatetext(); ein delegate erzeugt und mit

TextboxLog.Dispatcher.BeginInvoke(new Delegatetext(outputtext));

eine Funktion aufgerufen die da lautet :
public void outputtext ()
{
TextboxLog.Text = "Neue Clientverbindung von der IP : " ;
}

Nun ist die nächste Frage wie ich beim deligieren Parameter an die Funktion übergeben kann :>
 
Das geht im Prinzip genauso, du brauchst nur einen Delegaten, der die entsprechenden Parameter entgegen nimmt:

PHP:
//Methode die per Invoke aufgerufen werden soll:
public void OutputText (string ip)
{
      TextboxLog.Text = "Neue Clientverbindung von der IP : " +ip;
}

//passender Delegat:
delegate void OutputTextInvoker(string ip);

//Aufruf:
TextboxLog.Dispatcher.BeginInvoke(new OutputTextInvoker(OutputText), "123.123.1.1");
 
Achso, vielen Dank. Das "string ip" war der Teil der mir fehlte, das andere hatte ich schonmal ausprobiert ohne Erfolg und dachte es sei falsch :)
 
Ja, Multithreading mit c# ist manchmal richtig schwer und die häufigste Fehlerursache (zumindest bei mir)
 
Ich benutze Framework 3.5 nicht 4 :D
 
Ja ist ja richtig, aber auch da macht es keine Probleme ;) Besonders unter WPF nicht, weil es da den Dispatcher gibt, den es bei Winforms nicht gibt ;)
 
Zurück
Oben