У меня проблема в том, что когда я использую метод NetworkStream.BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state)
, обратный вызов вызывается до того, как данные действительно загружены, я думаю, что данные вставляются в очередь, ожидающую отправки из-за алгоритма Nagle.
Есть ли какой-нибудь способ узнать, завершена ли загрузка данных, затем выполнить некоторые действия или отправить остальные данные?
Мне нужно выполнить некоторые действия после загрузки данных (цель получила данные) и перед отправкой другого.
Спасибо.
Отправка данных
if (m_PendingSend)
{
var idB = BitConverter.GetBytes(id);
Array.Copy(idB, 0, bData2, bData.Length - 8, idB.Length);
if (isFile)
m_SendQueue.Add(bData2);
else
m_SendQueue.Insert(0, bData2);
}
else
{
m_PendingSend = true;
try
{
m_NetworkStream.BeginWrite(bData2, 0, bData2.Length - 8, new AsyncCallback(EndSend), id);
}
catch (Exception e)
{
e.Log();
Disconnect();
}
}
CallBack
private void EndSend(IAsyncResult ar)
{
lock (this)
{
try
{
m_NetworkStream.EndWrite(ar);
if (m_SendQueue.Count > 0)
{
byte[] bData = m_SendQueue[0];
var id = BitConverter.ToInt64(bData, bData.Length - 8);
m_SendQueue.RemoveAt(0);
m_NetworkStream.BeginWrite(bData, 0, bData.Length - 8, new AsyncCallback(EndSend), id);
}
else
{
m_PendingSend = false;
}
OnEndWrite?.Invoke((long)ar.AsyncState);
}
catch (Exception ex)
{
ex.Log();
Disconnect();
}
}
}