Как я могу проверить, загружены ли данные (цель получила данные) - PullRequest
0 голосов
/ 02 декабря 2018

У меня проблема в том, что когда я использую метод 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();
        }
    }
}
...