Вам не нужно читать все заново - при вызове
clientStream.EndRead(async);
возвращается количество прочитанных байтов, поэтому вам нужно будет сделать:
int bytesRead = clientStream.EndRead(async);
В этот момент ваш буфер заполнен этими байтами, синхронное чтение из потока будет просто читать больше байтов.
Если вы не хотите делать свой буфер переменной экземпляра, которую вы можете использоватьвместо этого закрытие с делегатом:
byte[] buffer = new byte[4];
clientStream.BeginRead(buffer, 0, buffer.Length, (IAsyncResult async) =>
{
int bytesRead = clientStream.EndRead(async);
if (bytesRead == 4)
{
int result = BitConverter.ToInt32(buffer, 0);
//..
}
}, clientStream);
Редактировать:
Лучшим решением может быть поместить все состояние в виде пользовательского класса и передать его вBeginRead()
:
public class StreamState
{
public byte[] Buffer { get; set; }
public NetworkStream Stream { get; set; }
}
clientStream.BeginRead(buffer, 0, buffer.Length, Read, new StreamState { Buffer = buffer, Stream = clientStream });
private void Read(IAsyncResult async)
{
StreamState state = (StreamState) async.AsyncState;
int bytesRead = state.Stream.EndRead(async);
if (bytesRead == 4)
{
int result = BitConverter.ToInt32(state.Buffer, 0);
//..
}
}