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[]バッファを1 つだけ使用してこれを行うことはできますか? または、すべての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 に答える