2

我正在尝试编写一个TcpClient实现。我想在处理数据时开始下一次读取,但我不确定我传入的字节数组何时BeginRead被修改。这是我当前的实现

private void ProcessData()
{
    byte[] buffer = new byte[_tcpClient.ReceiveBufferSize];
    var networkStream = _tcpClient.GetStream();

    IAsyncResult result = networkStream.BeginRead(buffer, 0, buffer.Length, null, null);

    int read;
    while ((read = networkStream.EndRead(result)) != 0)
    {
        result = networkStream.BeginRead(buffer, 0, buffer.Length, null, null);

        ProcessChunk(buffer, read);
    }  
}

BeginRead在长时间运行的函数之前开始下一个,因为我希望后台 IO 在我处理时开始获取下一个数据块。我可以只使用一个byte[]缓冲区来执行此操作,还是需要在每次BeginRead调用时交替进行?

private void ProcessData()
{
    bool bufferChoice = false;
    byte[] bufferA = new byte[_tcpClient.ReceiveBufferSize];
    byte[] bufferB = new byte[_tcpClient.ReceiveBufferSize];
    var networkStream = _tcpClient.GetStream();

    IAsyncResult result = networkStream.BeginRead(bufferA, 0, bufferA.Length, null, null);

    int read;
    while ((read = networkStream.EndRead(result)) != 0)
    {
        if (bufferChoice)
        {
            result = networkStream.BeginRead(bufferA, 0, bufferA.Length, null, null);
            ProcessChunk(bufferB, read); //Call function with B's buffer
        }
        else
        {
            result = networkStream.BeginRead(bufferB, 0, bufferB.Length, null, null);
            ProcessChunk(bufferA, read); //Call function with A's buffer
        }

        bufferChoice = !bufferChoice;
    }
}
4

1 回答 1

1

通常无法保证何时使用传递给 BeginRead 的缓冲区。理论上,它甚至可以在 BeginRead 调用期间被同步填充。

旁注:您应该编写始终正确运行的代码,因为它比猜测特定实现的特定行为更容易推理。在这种情况下,只需复制数据或使用多个缓冲区,这样您就永远不会有未完成的 IO 和处理共享同一个缓冲区。

于 2012-10-24T22:09:26.000 回答