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