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(); } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д