2013-08-23 13 views
9

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.

+0

Warum versuchst du nicht 'bytes.ToString()' anstelle von 'Encoding.UTF8.GetString (bytes)' oder fehle ich hier ein paar Grundlagen? – Malachi

+3

@Malachi: Was soll ich mit 'System.Byte []' (was von 'ToString()' erzeugt wird) dann tun? –

+0

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

Antwort

1

Basierend auf dem Code, den Sie gepostet haben, wird StreamCallback() blockieren, bis der Stream endet. Sie übergeben einen Bytezeiger an Encoding.UTF8.GetString (Bytes); Also muss es Bytes bis zum Ende abfragen. Es wird niemals das Ende erreichen, da Bytes aus einem Stream kommen, bis dieser Stream geschlossen ist.

Sie müssen entweder eine bestimmte Anzahl von Bytes gleichzeitig verarbeiten oder bis ein bestimmtes Zeichen angezeigt wird.