我正在使用Windows 8 Metro App中的StreamSockets,并希望使用DataReader来读取传入的数据。我是否应该使用任何特定的模式或模型来从套接字中读取,这样我就可以随时读取网络缓冲区中的所有可用数据?
目前,我知道我需要调用DataReader.LoadAsync()然后调用DataReader.Read ...()。我希望能够随时读取当前网络缓冲区的所有内容。当我想检测传入消息的结束时,我的问题出现了。如果我尝试使用循环来连续调用LoadAsync,它将在到达网络缓冲区末尾时阻塞。我知道在.NET 4.0中,有一个NetworkStream类提供了一个DataAvailable字段,它告诉我网络缓冲区中是否存在任何数据,因此我可以继续循环直到此标志为false。有没有办法做类似的事情,这样我就可以使用网络缓冲区中的所有可用数据,而不必长时间阻塞?
答案 0 :(得分: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();
}