1

我正在使用 Windows 8 Metro 应用程序中的 StreamSockets,并希望使用 DataReader 来读取传入的数据。是否有任何特定的模式或模型我应该用来从套接字中读取,以允许我随时读取网络缓冲区中的所有可用数据?

目前,我知道我需要调用 DataReader.LoadAsync(),然后调用 DataReader.Read…()。我希望能够随时读取网络缓冲区中的所有内容。当我想检测传入消息的结尾时,我的问题就出现了。如果我尝试使用循环来连续调用 LoadAsync,它会在到达网络缓冲区末尾时阻塞。我知道在 .NET 4.0 中,有一个 NetworkStream 类提供了一个 DataAvailable 字段,它告诉我网络缓冲区中是否存在任何数据,这样我就可以继续循环,直到这个标志为假。有什么方法可以做类似的事情,让我可以消耗网络缓冲区中的所有可用数据而不必长时间阻塞?

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 回答