2010-12-09 4 views
1

Ich bin wirklich neu in der C# -Programmierung und entwickle eine Anwendung, die auf einem TcpClient basiert.NetworkStream BeginRead/EndRead

Ich möchte gerne BeginRead verwenden & EndRead, ich habe bereits MSN-Dokumentation gelesen, hilft aber nicht.

Ich habe dies:

private void Send() 
    { 
     TcpClient _client = new TcpClient("host", 80); 
     NetworkStream ns = _client.GetStream(); 
     ns.Flush(); 
     /... 
     ns.Write(buffer, 0, buffer.Length); 

     int BUFFER_SIZE = 1024; 
     byte[] received = new byte[BUFFER_SIZE]; 
     ns.BeginRead(received, 0, 0, new AsyncCallback(OnBeginRead), ns); 
    } 

    private void OnBeginRead(IAsyncResult ar) 
    { 
     NetworkStream ns = (NetworkStream)ar.AsyncState; 
     int BUFFER_SIZE = 1024; 
     byte[] received = new byte[BUFFER_SIZE]; 
     string result = String.Empty; 

     ns.EndRead(ar); 

     int read; 
     while (ns.DataAvailable) 
     { 
      read = ns.Read(received, 0, BUFFER_SIZE); 
      result += Encoding.ASCII.GetString(received); 
      received = new byte[BUFFER_SIZE]; 
     } 
     result = result.Trim(new char[] { '\0' }); 
     // Want to update Form here with result 
    } 

Wie kann ich ein Formular Komponente Ergebnis aktualisieren?

Vielen Dank für Hilfe.

+0

Ist das Winforms? – CodingGorilla

+0

Ja, es ist WinForms. –

+0

Ich hatte hier das gleiche Problem und ich wollte wissen, ob es in Ordnung ist, ein Ereignis an der Stelle aufzusetzen, an der Sie eine Kommentarzeile zum Aktualisieren des Formulars eingefügt haben. abonnieren Sie die Veranstaltung von Form und aktualisieren was? oder ist es in einem separaten Thread und wird ein Problem verursachen? Vielen Dank. – Shamim

Antwort

1

Zuerst empfehle ich, viel über Multithreading zu lernen. Dann komm zurück und lerne etwas über Steckdosen. Beide haben ziemlich steile Lernkurven, und beide versuchen zu lösen ist ein Los zu handhaben.

Das heißt, Sie können eine Aktualisierung auf der Benutzeroberfläche veröffentlichen, indem Sie den UI-Kontext über TaskScheduler.FromCurrentSynchronizationContext erfassen und eine Task auf diese TaskScheduler planen. Wenn die TPL nicht verfügbar ist, können Sie einfach SynchronizationContext direkt verwenden.

+0

Ich habe mehr über SynchronizationContext gelesen und funktioniert perfekt, danke! Werde mehr über beide lesen, danke :) –

Verwandte Themen