2013-08-23 28 views
9

Tôi có chức năng gọi lại, trong đó tôi đang cố ghi dữ liệu mà tôi đã đọc trong ReadAsync().Tại sao chặn Console.WriteLine() trong gọi lại từ 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() trông như sau.

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; 
} 

Điều tôi thực sự muốn đạt được là theo dõi luồng mạng ngay trước khi được phân tích cú pháp bởi XmlReader. Điều này liên quan đến câu hỏi khác của tôi>Reading from same SslStream simultaneously? <. Tôi sẽ làm như thế nào?

CẬP NHẬT:

Nó thực sự là Encoding.UTF8.GetString(bytes) được chặn ứng dụng. Để cho câu hỏi được hoàn chỉnh hơn, tôi liệt kê mã để đọc luồng 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

tại sao bạn không thử 'bytes.ToString()' thay vì 'Encoding.UTF8.GetString (bytes)' hoặc tôi thiếu một số khái niệm cơ bản ở đây? – Malachi

+3

@Malachi: Tôi nên làm gì với 'System.Byte []' (được sản xuất bởi 'ToString()') sau đó? –

+0

Tôi không chắc chắn rằng tôi đang theo dõi những gì được cho là được thực hiện ở đây. 'Console.WriteLine()' chỉ cần viết ra 'byte []' để cho nó in tương đương với 'byte []' như 'char []' không nên thay đổi những gì bạn đang làm ở đó? 'OnDataRecieved' của bạn có lẽ nên lấy một' byte [] 'và không phải là một chuỗi (' char [] ') là những gì tôi đang nghĩ. Tôi có thể rất sai. chỉ cần cố gắng để hiểu chính xác những gì đang xảy ra – Malachi

Trả lời

1

Dựa trên mã bạn đã đăng, StreamCallback() sẽ chặn cho đến khi luồng đó kết thúc. Bạn chuyển một con trỏ byte tới Encoding.UTF8.GetString (byte); Vì vậy, nó cần phải tiếp tục truy vấn byte cho đến khi nó đạt đến kết thúc. Nó sẽ không bao giờ đạt đến kết thúc vì các byte đến từ một luồng cho đến khi luồng đó được đóng lại.

Bạn cần xử lý luồng của mình một số byte nhất định tại một thời điểm hoặc cho đến khi một ký tự nhất định được nhìn thấy.

Các vấn đề liên quan