我有一个问题,当我使用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();
}
}
回叫
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();
}
}
}