На сайте Microsoft вы можете найти этот код для ReadCallback(IAsyncResult)
static void ReadCallback(IAsyncResult ar)
{
StateObject state = (StateObject)ar.AsyncState;
Socket handler = state.workSocket;
int read = handler.EndReceive(ar);
if(read > 0)
{
state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, read));
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), state);
}
else
{
if(state.sb.Length > 1)
{
string content = state.sb.ToString();
Console.WriteLine($"Read {content.Length} bytes from socket. \nData: {content}");
}
handler.Close();
}
}
Что мне неясно, так это if/else
утверждение. Почему мы снова BeginReceive
, если уже что-то читаем?
Почему бы нам просто не сделать
static void ReadCallback(IAsyncResult ar)
{
StateObject state = (StateObject)ar.AsyncState;
Socket handler = state.workSocket;
int read = handler.EndReceive(ar);
state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, read));
if(state.sb.Length > 1)
{
string content = state.sb.ToString();
Console.WriteLine($"Read {content.Length} bytes from socket. \nData: {content}");
}
handler.Close();
}