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();
}
}