C# Problem mit Threading

eXPoser

Lt. Commander
Dabei seit
Mai 2005
Beiträge
1.965
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:

firesnow

Cadet 4th Year
Dabei seit
Dez. 2008
Beiträge
77
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.
 

eXPoser

Lt. Commander
Ersteller dieses Themas
Dabei seit
Mai 2005
Beiträge
1.965
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 :>
 

Grantig

Captain
Dabei seit
Okt. 2008
Beiträge
3.543
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");
 
Dabei seit
Dez. 2009
Beiträge
213
Ja, Multithreading mit c# ist manchmal richtig schwer und die häufigste Fehlerursache (zumindest bei mir)
 

toeffi

Lt. Junior Grade
Dabei seit
Feb. 2010
Beiträge
474
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 ;)
 
Top