2014-01-24 50 views
0

我想弄清楚如何使用Microsoft推荐的基于任务的异步/等待方法来等待NetworkStream上的数据。将同步代码(使用BinaryReader)转换为使用NetworkStream的异步/等待

到目前为止我只是循环,直到数据变得可用,界河是probaby不好:

using (NetworkStream stream = client.GetStream()) 
{ 
    while (true) 
    { 
     if (stream.CanRead && stream.DataAvailable) 
     { 
      using(BinaryReader reader = new BinaryReader(stream)) 
      { 
       byte data = reader.ReadByte(); 
      } 
     } 
    } 
} 
+4

显示一些代码? – Jason

+0

它假设其工作方式与通常的方法非常相似,只需添加async/await关键字即可。 – liran63

+0

没有代码,甚至不知道从哪里开始 – user25470

回答

2

所有可以建议在这个时候是NetworkStream.ReadAsync

result = new byte[1024]; 
var bytesRead = await SourceStream.ReadAsync(result, 0, result.Lengh); 
+2

但不会在ReadAsync返回流中没有数据? – user25470

+0

@ user25470它应该读取0个字节,除非流被关闭。检查文档:“...结果值...可以是0(零),如果已到达流的末尾” –

+0

请勿使用此方法。正如@ user25470所提到的那样,'ReadAsync'(就像'Read'一样)并不能保证'result.Lengh'字节将被读取。相反,它会尽可能快地返回。但是,除非流关闭,否则它不会返回0字节。 – torvin