2010-12-09 6 views
1

Я действительно новичок в программировании на C#, и я разрабатываю приложение на основе TcpClient.NetworkStream BeginRead/EndRead

Я хотел бы знать, как использовать BeginRead & EndRead, я уже прочитал документацию MSN, но не помогает.

Я это:

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 
    } 

Как я могу обновить компонент формы, используя результат?

Спасибо за помощь.

+0

Это Winforms? – CodingGorilla 2010-12-09 15:41:44

+0

Да, это WinForms. – 2010-12-09 15:54:06

ответ

1

Во-первых, я рекомендую многому научиться многопоточности. Затем вернитесь и узнайте о сокетах. У обоих из них есть довольно крутые кривые обучения, и для решения проблемы стоит лот.

Тем не менее, вы можете опубликовать обновление пользовательского интерфейса, захватив контекст пользовательского интерфейса с помощью TaskScheduler.FromCurrentSynchronizationContext и планирование Task к этому TaskScheduler. Если TPL недоступен, вы можете просто использовать SynchronizationContext напрямую.

Смежные вопросы