2013-08-23 92 views
9

我有一個回調函數,我試圖寫一個覆蓋ReadAsync()中讀取的數據。爲什麼Console.WriteLine()阻塞從Stream.ReadAsync()回調?

private void StreamCallback(byte[] bytes) 
{ 
    Console.WriteLine("--> " + Encoding.UTF8.GetString(bytes)); // the whole application is blocked here, why? 
    if (OnDataReceived != null) 
    { 
     string data = Encoding.UTF8.GetString(bytes); 
     OnDataReceived(data); 
    } 
} 

重寫ReadAsync()如下所示。

public override async Task<int> ReadAsync(byte[] buffer, int offset, int count, System.Threading.CancellationToken cancellationToken) 
{ 
    var read = await _originalStream.ReadAsync(buffer, offset, count, cancellationToken); 
    _readCallback(buffer); 

    return read; 
} 

我真正想要實現的是在XmlReader解析之前監視網絡流。這涉及到我的其他問題>Reading from same SslStream simultaneously? <。我會怎麼做?

UPDATE

它實際上是Encoding.UTF8.GetString(bytes)正在阻止該應用程序。爲了使問題更加完整,我列出了讀取XML流的代碼。

using (XmlReader r = XmlReader.Create(sslStream, new XmlReaderSettings() { Async = true }))     
{ 
    while (await r.ReadAsync()) 
    { 
     switch (r.NodeType) 
     { 
      case XmlNodeType.XmlDeclaration: 
       ... 
       break; 
      case XmlNodeType.Element: 
... 
+0

你爲什麼不嘗試使用'bytes.ToString()'而不是'Encoding.UTF8.GetString(bytes)'或者我在這裏丟失了一些基礎知識? – Malachi

+3

@Malachi:我應該如何處理'System.Byte []'(由'ToString()'產生)呢? –

+0

我不確定我是否按照應該在這裏完成的工作。 'Console.WriteLine()'應該只寫出'byte []',以便告訴它將'byte []'等同於'char []'打印出來不應該改變你在那裏做什麼?你的'OnDataRecieved'應該可能採用'byte []'而不是字符串('char []')就是我所想的。我可能是非常錯誤的。只是試圖瞭解究竟是怎麼回事 – Malachi

回答

1

根據您發佈的代碼,StreamCallback()將阻塞,直到該流結束。您將一個字節指針傳遞給Encoding.UTF8.GetString(bytes);所以,它需要保持查詢字節,直到它結束。它將永遠不會到達最後,因爲字節來自流,直到流被關閉。

您需要一次處理您的數據流一定數量的字節或直到看到某個字符。

相關問題