2010-12-09 33 views
1

Je suis vraiment novice en programmation C# et je développe une application basée sur un TcpClient.NetworkStream BeginRead/EndRead

Je voudrais savoir comment utiliser BeginRead & EndRead, j'ai déjà lu la documentation de MSN mais n'aide pas.

J'ai ceci:

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 
    } 

Comment puis-je mettre à jour un composant en utilisant le formulaire résultat?

Merci pour votre aide.

+0

Est-ce Winforms? – CodingGorilla

+0

Oui, c'est WinForms. –

+0

J'ai eu le même problème ici et je voulais savoir si c'est OK de monter un événement à l'endroit où vous avez inséré une ligne de commentaire pour mettre à jour le formulaire. abonnez-vous à l'événement de Formulaire et mettre à jour ce que c'est? ou est-ce dans un fil séparé et causera un problème? Merci. – Shamim

Répondre

1

Premièrement, je recommande d'en apprendre beaucoup sur le multithreading. Puis revenez et découvrez les prises. Les deux ont des courbes d'apprentissage plutôt raides, et en essayant de s'attaquer aux deux est un lot à gérer. Cela dit, vous pouvez publier une mise à jour de l'interface utilisateur en capturant le contexte de l'interface utilisateur via TaskScheduler.FromCurrentSynchronizationContext et en programmant un Task à TaskScheduler. Si le TPL n'est pas disponible, vous pouvez utiliser directement SynchronizationContext.

+0

J'ai lu plus sur SynchronizationContext et fonctionne parfaitement, merci! En lire plus sur les deux, merci :) –