tomycat hat folgendes geschrieben : |
THX,
ich habe ein anderes Problem bekommen, wie kann ich in der Funktion einen Text in eine Textbox ausgeben? |
Das geht am besten, indem du den Rat von Christian beherzigst
Diese IO Methoden bieten in der Regel eine Async() Methode an. Damit wartet der Hauptthread deines Programms auf die Antwort vom Server, kann aber zwischendurch trotzdem auf Benutzereingaben reagieren. (vgl:
docs.microsoft.com/d...ide/concepts/async/)
Für deinen Code könnte das in etwa so aussehen:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| private async void button1_ClickAsync(object sender, EventArgs e) { client = new TcpClient(server, port); stream = client.GetStream();
textbox1.Text = await ReceiveString(stream);
await SendString(stream, "USER x \r\n");
textbox1.Text = await ReceiveString(stream); }
public async Task SendString(NetworkStream stream, string nachricht) { byte[] data = System.Text.Encoding.ASCII.GetBytes(nachricht); await stream.WriteAsync(data, 0, data.Length); }
public async Task<string> ReceiveString(NetworkStream stream, int timeout = 1000) { stream.ReadTimeout = timeout; var data = new byte[200]; int receivedBytes = await stream.ReadAsync(data, 0, 200); return System.Text.Encoding.ASCII.GetString(data, 0, receivedBytes); } |
Du siehst, mit await wird der Code sehr viel "linearer" und dadurch lesbarer. Einen Task<string> kannst du als Aktion verstehen, die in Zukunft einen string zurückliefert. Mit await unterbrichst du den Thread und wartest genau darauf, dass das passiert.
Ganz wichtig: Die Wiederaufnahme passiert in der Regel im gleichen Thread, daher benötigst du keinerlei
.Invoke( oder so.