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

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

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

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

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

textual
Листинг программы
  1.     class Player
  2.     {
  3.         private Session session;
  4.         private bool connected;
  5.  
  6.         public Player(TcpClient client)
  7.         {
  8.             connected = true;
  9.             session = new Session(client);
  10.             session.OnDataReceived += Session_OnDataReceived;
  11.         }
  12.  
  13.         private void Session_OnDataReceived(byte[] data, int len)
  14.         {
  15.             if (len == 0)
  16.             {
  17.                 connected = false;
  18.                 return;
  19.             }
  20.             string str = Encoding.ASCII.GetString(data, 0, len);
  21.             // что-то делаем...
  22.         }
  23.     }
  24.  
  25.     class Session
  26.     {
  27.         private NetworkStream stream;
  28.         private byte[] m_buffer = new byte[4096];
  29.         public Session(TcpClient client)
  30.         {
  31.             stream = client.GetStream();
  32.  
  33.             Read();
  34.         }
  35.  
  36.         public delegate void DataReceivedDelegate(byte[] data, int len);
  37.  
  38.         public event DataReceivedDelegate OnDataReceived;
  39.  
  40.         private void Read()
  41.         {
  42.             stream.BeginRead(m_buffer, 0, m_buffer.Length, OnRead, null);
  43.         }
  44.  
  45.         private void OnRead(IAsyncResult result)
  46.         {
  47.             int numRead = stream.EndRead(result);
  48.             OnDataReceived?.Invoke(m_buffer, numRead);
  49.             Read();
  50.         }
  51.     }

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


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

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

8   голосов , оценка 3.25 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы