2013-08-23 16 views
9

Mam funkcję wywołania zwrotnego, w którym próbuję zapisać dane, które czytam w overriden ReadAsync().Dlaczego funkcja Console.WriteLine() blokuje wywołanie zwrotne z funkcji 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); 
    } 
} 

Przesłonięta ReadAsync() wygląda następująco.

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

Co naprawdę chcę osiągnąć, to monitorowanie strumienia sieciowego tuż przed jego analizą przez XmlReader. To dotyczy mojego drugiego pytania>Reading from same SslStream simultaneously? <. Jak to zrobić?

UPDATE:

To jest rzeczywiście Encoding.UTF8.GetString(bytes) że blokuje aplikację. Aby pytanie było bardziej kompletne, wymieniam kod do czytania strumienia 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

dlaczego nie wypróbujesz 'bytes.ToString()' zamiast 'Encoding.UTF8.GetString (bytes)' lub czy brakuje mi tutaj pewnych podstaw? – Malachi

+3

@Malachi: Co powinienem zrobić z 'System.Byte []' (który jest produkowany przez 'ToString()'), a następnie? –

+0

Nie jestem pewien, czy podążam za tym, co powinno być tutaj zrobione. "Console.WriteLine()" powinno po prostu napisać "byte []", mówiąc mu, żeby wydrukował odpowiednik 'byte []' jako 'char []' nie powinien zmieniać tego, co tu robisz? twoje 'OnDataRecieved' powinno prawdopodobnie wziąć' byte [] ', a nie ciąg znaków (' char [] ') jest tym, o czym myślę. Mógłbym być bardzo zły. tylko próbuję zrozumieć co dokładnie się dzieje – Malachi

Odpowiedz

1

Na podstawie opublikowanego kodu funkcja StreamCallback() będzie blokować, dopóki ten strumień się nie skończy. Przekazujesz wskaźnik bajtu do Encoding.UTF8.GetString (bytes); Musi więc sprawdzać bajty, aż osiągnie koniec. Nigdy nie dojdzie do końca, ponieważ bajty pochodzą ze strumienia, dopóki ten strumień nie zostanie zamknięty.

Musisz albo przetworzyć strumień pewnej liczby bajtów na raz, albo do momentu, aż zobaczysz określoną postać.

Powiązane problemy