NetworkStream, BeginRead, EndRead не могу понять как работает - C#

Узнай цену своей работы

Формулировка задачи:

В общем есть некий подключённый TcpClient и у него есть поток NetworkStream: TcpClient.GetStream() Мне необходимо асинхронно считать данные из этого потока, ну если они есть естественно. Причём таких подключений(ТСП клиентов) у меня может быть и 100 и 1000 и 100000... Поэтому я выбрал асинхронное чтение, но не могу понять как его реализовать и вообще как оно работает! Вот я создаю новый Thread и стартую его
static private byte[] ReadBuffer = new byte[1024];
static private void CheckStreamPlayer()
        {
            while (true)
            {   for (int i = 0; i < PlayerList.Count; i++) // Проверяем Всех стреам
                {   try // Проверяем на какую-нибудь ошибку
                    {   if (PlayerList[i].GetStream().DataAvailable) // Если есть данные в каком-то стреам
                        {
                            // Здесь начинаю асинхронное чтение методом BeginRead
                            PlayerList[i].GetStream().BeginRead(ReadBuffer, 0, ReadBuffer.Length, EndReading, null);
                            // И тут типа должно пойти дальше проверять стриамы
                            // А когда вот этот наш асинхронно прочтёт, то должно вызваться EndReading? Или что, я вот тут не понимаю :(
                        }
                    } catch { PlayerList[i].Close(); PlayerList.RemoveAt(i); i--; } // при ошибке, отключаем и удаляем
                } // если никого нет, то немножко спим
                if (PlayerList.Count == 0) { Thread.Sleep(1); }
            }
        }
В msdn microsoft читал и всё равно не могу понять. https://msdn.microsoft.com/ru-ru/lib...vs.110%29.aspx https://msdn.microsoft.com/ru-ru/lib...vs.110%29.aspx Вот здесь получается завершается чтение
static private void EndReading(IAsyncResult ar)
        {
            // Здесь мне нужно вот результат полученных асинхронно байт перекодировать в string, типа
            string Result = Encoding.ASCII.GetString(ReadBuffer, 0, ReadBufferSize)
            // Я не могу понять откуда мне взять результат выполнения асинхронной операции вот именно в этом методе!
        }
Если не понимаю, объясните, а не отправляйте читать книжки. И мне нужно именно этим способом выполнить асинхронную операцию.

Решение задачи: «NetworkStream, BeginRead, EndRead не могу понять как работает»

textual
Листинг программы
    class Player
    {
        private Session session;
        private bool connected;
 
        public Player(TcpClient client)
        {
            connected = true;
            session = new Session(client);
            session.OnDataReceived += Session_OnDataReceived;
        }
 
        private void Session_OnDataReceived(byte[] data, int len)
        {
            if (len == 0)
            {
                connected = false;
                return;
            }
            string str = Encoding.ASCII.GetString(data, 0, len);
            // что-то делаем...
        }
    }
 
    class Session
    {
        private NetworkStream stream;
        private byte[] m_buffer = new byte[4096];
        public Session(TcpClient client)
        {
            stream = client.GetStream();
 
            Read();
        }
 
        public delegate void DataReceivedDelegate(byte[] data, int len);
 
        public event DataReceivedDelegate OnDataReceived;
 
        private void Read()
        {
            stream.BeginRead(m_buffer, 0, m_buffer.Length, OnRead, null);
        }
 
        private void OnRead(IAsyncResult result)
        {
            int numRead = stream.EndRead(result);
            OnDataReceived?.Invoke(m_buffer, numRead);
            Read();
        }
    }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.25 из 5
Похожие ответы