2015-12-27 93 views
2

我需要檢查我的客戶端是否在緩衝區中有東西,所以我沒有等待寫入它。如何檢查在StreamReader上是否有東西需要讀取?

private async void ThreadMethod_ListenClient() 
    { 
     while (true) { 
      if (ClientQueue.Count == 0) 
       continue; 
      Client client = (Client)ClientQueue.Dequeue(); 
      if (client.Reader != null) { 
       string Say = await client.Reader.ReadLineAsync(); 
       if (Say != null) { 
        if (Say.Length != 0) { 
         Console.WriteLine (Say); 
        } 
       } 
      } 
      ClientQueue.Enqueue (client); 

     } 
    } 

client.Reader:從TcpClient的

client.Socket的StreamReader:TcpClient的

如何檢查是否 'client.Reader' 空?

obs。 C#與單聲道

+0

'if(Say!= null)'回答你自己的問題! –

回答

1

StreamReader.ReadLine()方法返回null如果流結束已達到或沒有什麼可以讀取。因此,您可以檢查是否有任何要閱讀的內容。

if (client.Reader != null && client.Reader.ReadLine() != null) 
+0

string Say = await client.Reader.ReadLineAsync()!= null;它已經檢查了 –

1

如何檢查是否我有話要對一個StreamReader讀?

我不知道StreamReader,但TcpClient可以使用TcpClient.GetStream()方法,它返回NetworkStream這反過來又DataAvailable財產。

您可避免通過檢查DataAvailable財產阻塞讀操作:這是在備註TcpClient.GetStreamdocumentation部分解釋。

編輯:我已經發布這個,因爲你的代碼運行到一個特定的域。雖然其他答案/評論中描述的一般方法適用於正常有限流(如FileStream,MemoryStream等),但它不適用於像NetworkStream這樣的無限流。

+0

StreamReader a = new StreamReader(client.GetStream())爲此套接字製作了StreamReader。我只是在StreamReader上工作:) –

+0

但仍然是'Stream'的底層是'NetworkStream'。 StreamReader只是流上的一個抽象。 –

+0

它可以正常工作,但流速很慢。 –

2

StreamReader.Peek()返回-1當文件結束或沒有什麼可讀的時候。 可以檢查如下:

while(StreamReader.Peek() != -1){ 
    //Your code here 
} 
+0

他還在等待:( –

+0

我不明白? 當然在你的情況下,你會使用'client.Reader.Peek()'而不是StreamReader.Peek() –

相關問題