Ich habe eine Rückruffunktion, in der ich versuche, die Daten zu schreiben, die ich in einem überschriebenen ReadAsync() gelesen habe.Warum blockiert Console.WriteLine() beim Rückruf von 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);
}
}
Die überschriebene ReadAsync() sieht wie folgt aus.
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;
}
Was will ich eigentlich erreichen, ist ein Netzwerk-Stream zu überwachen, kurz bevor es durch einen XmlReader analysiert wird. Dies bezieht sich auf meine andere Frage>Reading from same SslStream simultaneously? <. Wie würde ich das tun?
UPDATE:
Es ist eigentlich Encoding.UTF8.GetString(bytes)
, die die Anwendung blockiert. Um die Frage zu vervollständigen, listet ich den Code zum Lesen des XML-Streams auf.
Warum versuchst du nicht 'bytes.ToString()' anstelle von 'Encoding.UTF8.GetString (bytes)' oder fehle ich hier ein paar Grundlagen? – Malachi
@Malachi: Was soll ich mit 'System.Byte []' (was von 'ToString()' erzeugt wird) dann tun? –
Ich bin mir nicht sicher, ob ich dem folge, was hier gemacht werden soll. die 'Console.WriteLine()' sollte nur das 'byte []' ausschreiben, also sollte es das Äquivalent von 'byte []' als 'char []' ausgeben, sollte das nicht ändern, was Sie dort tun? Ihr 'OnDataRecieved' sollte wahrscheinlich ein' byte [] 'und nicht eine Zeichenkette (' char [] ') nehmen, was ich denke. Ich könnte mich sehr irren. nur versuchen zu verstehen, was genau los ist – Malachi