Autor Beitrag
tomycat Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 265
Erhaltene Danke: 1



BeitragVerfasst: Mo 18.03.19 09:33 
genau so ist es.thx
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mo 18.03.19 14:52 
Noch ein Hinweis: Wenn Du mit async und await arbeiten willst, dann solltest Du es auch "richtig" tun. Auf eigentlich asynchrone Methoden mit einem Aufruf von Wait zu warten, kann zu einem Deadlock führen: blog.stephencleary.c...k-on-async-code.html

Du kannst die Event-Handler z.B. als
ausblenden C#-Quelltext
1:
private async void button1_Click(object sender, EventArgs e)					

deklarieren und dann darin await verwenden. Dann kannst Du die einzelnen Aufrufe von Task.Run vollständig auflösen in einen "normalen" Quelltext.



//edit: bzw. solltest Du generell mal schauen, wofür Du async / await bei Dir überhaupt brauchst, ich sehe da bis auf Task.Delay keinen asynchronen Aufruf und den kann mit Thread.Sleep ersetzen ...

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".

Für diesen Beitrag haben gedankt: tomycat
tomycat Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 265
Erhaltene Danke: 1



BeitragVerfasst: Di 19.03.19 13:16 
THX,

ich habe ein anderes Problem bekommen, wie kann ich in der Funktion einen Text in eine Textbox ausgeben?

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
 public async Task meinsender(string nachricht)
        {
            MessageBox.Show(nachricht);
            Byte[] data = System.Text.Encoding.ASCII.GetBytes(nachricht);
            stream.Write(data, 0, data.Length);
            Console.WriteLine("Sent: {0}", nachricht);     
        }


Console.WriteLine geht ohne Probleme.
ausblenden C#-Quelltext
1:
textBox1.Invoke((MethodInvoker)(() => { textbox1.Text = responseData; }));  // was muss ich hier ändern?					
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: So 24.03.19 14:00 
user profile icontomycat hat folgendes geschrieben Zum zitierten Posting springen:
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:
ausblenden 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, 0200);
    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.

Für diesen Beitrag haben gedankt: tomycat