NetworkStream BeginRead / EndRead - PullRequest
       5

NetworkStream BeginRead / EndRead

1 голос
/ 09 декабря 2010

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

Я хотел бы знать, как использовать 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
    }

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

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

1 Ответ

1 голос
/ 09 декабря 2010

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

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

...