NetworkStream, BeginRead, EndRead не могу понять как работает - C#
Формулировка задачи:
В общем есть некий подключённый TcpClient и у него есть поток NetworkStream: TcpClient.GetStream()
Мне необходимо асинхронно считать данные из этого потока, ну если они есть естественно. Причём таких подключений(ТСП клиентов) у меня может быть и 100 и 1000 и 100000...
Поэтому я выбрал асинхронное чтение, но не могу понять как его реализовать и вообще как оно работает!
Вот я создаю новый Thread и стартую его
В 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 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); }
- }
- }
Листинг программы
- 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();
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д