Вам нужно дождаться события Completed
, прежде чем вы сможете сделать еще одну асинхронную отправку.Не забудьте добавить собственный обработчик событий, чтобы вы могли получить обратный вызов:
e.Completed += new EventHandler<SocketAsyncEventArgs>(SendCallback);
Вы можете использовать мой пример асинхронного HTTP-клиента для моделирования вашего:
private void BeginSend()
{
_clientState = EClientState.Sending;
byte[] buffer = GetSomeData(); // gives you data for the buffer
SocketAsyncEventArgs e = new SocketAsyncEventArgs();
e.SetBuffer(buffer, 0, buffer.Length);
e.Completed += new EventHandler<SocketAsyncEventArgs>(SendCallback);
bool completedAsync = false;
try
{
completedAsync = _socket.SendAsync(e);
}
catch (SocketException se)
{
Console.WriteLine("Socket Exception: " + se.ErrorCode + " Message: " + se.Message);
}
if (!completedAsync)
{
// The call completed synchronously so invoke the callback ourselves
SendCallback(this, e);
}
}
Вот метод обратного вызова:
private void SendCallback(object sender, SocketAsyncEventArgs e)
{
if (e.SocketError == SocketError.Success)
{
// You may need to specify some type of state and
// pass it into the BeginSend method so you don't start
// sending from scratch
BeginSend();
}
else
{
Console.WriteLine("Socket Error: {0} when sending to {1}",
e.SocketError,
_asyncTask.Host);
}
}
После завершения обратного вызова вы можете сделать еще один вызов на BeginSend
еще раз, пока не закончите отправку данных.