1

Windows 8 Metro アプリで StreamSockets を使用しており、DataReader を使用して受信データを読み取りたいと考えています。ネットワークバッファで利用可能なすべてのデータをいつでも読み取ることができるようにするソケットから読み取るために使用する必要がある特定のパターンまたはモデルはありますか?

現在、DataReader.LoadAsync() を呼び出してから DataReader.Read…() を呼び出す必要があることを理解しています。ネットワークバッファに存在するすべてのものをいつでも読み取れるようにしたいと考えています。着信メッセージの終わりを検出したいときに問題が発生します。ループを使用して LoadAsync を継続的に呼び出そうとすると、ネットワーク バッファーの最後に到達するとブロックされます。.NET 4.0 には、ネットワーク バッファーにデータが存在するかどうかを示す DataAvailable フィールドを提供する NetworkStream クラスがあるため、このフラグが false になるまでループを続けることができます。長時間ブロックすることなく、ネットワークバッファで利用可能なすべてのデータを消費できるようにする同様の方法はありますか?

4

1 に答える 1

0

DataReader.InputStreamOptions=InputStreamOptions.Partialを設定します。これにより、指定したバッファーが完全にいっぱいになる前に、(タスクが)戻るのを待つことになります。

using(DataReader inputStream = new DataReader(this.connection.InputStream))
{
    inputStream.InputStreamOptions = InputStreamOptions.Partial;
    DataReaderLoadOperation loadOperation = inputStream.LoadAsync(2500);
    await loadOperation;
    if(loadOperation.Status != AsyncStatus.Completed)
    {
        this.Disconnect();  //insert your handler here
        return;
    }

    //read complete message
    uint byteCount = inputStream.UnconsumedBufferLength;

    byte [] bytes = new byte[byteCount];
    inputStream.ReadBytes(bytes);

    this.handleServerMessage(bytes);  //insert your handler here

    //detach stream so that it won't be closed when the datareader is disposed later
    inputStream.DetachStream();                
}
于 2012-12-17T18:03:55.143 に答える