2013-08-23 6 views
9

Ho una funzione di callback in cui sto cercando di scrivere i dati che ho letto in un ReadAsync() sovrascritto.Perché Console.WriteLine() blocca in callback da 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); 
    } 
} 

Il sovrascritto ReadAsync() ha il seguente aspetto.

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

Quello che in realtà voglio raggiungere è quello di monitorare un flusso di rete poco prima che venga analizzata da un XmlReader. Questo si riferisce alla mia altra domanda>Reading from same SslStream simultaneously? <. Come potrei farlo?

UPDATE:

In realtà è Encoding.UTF8.GetString(bytes) che blocca l'applicazione. Affinché la domanda sia più completa, sto elencando il codice per leggere lo stream 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

perché non provi 'bytes.ToString()' invece di 'Encoding.UTF8.GetString (bytes)' o mi mancano alcune nozioni di base qui? – Malachi

+3

@Malachi: Cosa dovrei fare con 'System.Byte []' (che è prodotto da 'ToString()') allora? –

+0

Non sono sicuro di seguire ciò che dovrebbe essere fatto qui. il 'Console.WriteLine()' dovrebbe semplicemente scrivere il 'byte []' così dicendo di stampare l'equivalente di 'byte []' come 'char []' non dovrebbe cambiare quello che stai facendo lì? il tuo 'OnDataRecieved' dovrebbe probabilmente prendere un' byte [] 'e non una stringa (' char [] ') è ciò che sto pensando. Potrei sbagliarmi. Sto solo cercando di capire cosa sta succedendo esattamente – Malachi

risposta

1

In base al codice che hai postato, StreamCallback() bloccherà fino alla fine del flusso. Si passa un puntatore di byte a Encoding.UTF8.GetString (byte); Quindi, deve continuare a interrogare i byte finché non raggiunge la fine. Non arriverà mai alla fine poiché i byte provengono da uno streaming fino alla chiusura di quel flusso.

È necessario elaborare il flusso di un certo numero di byte alla volta o finché non viene visualizzato un determinato carattere.