2013-08-23 18 views
9

Aşırı okunur bir ReadAsync() dosyasında okuduğum verileri yazmaya çalıştığım bir geri arama işlevim var.Console.WriteLine(), Stream.ReadAsync() öğesinden geri aramada neden engelleniyor?

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

Aşırı okunur ReadAsync() aşağıdaki gibi görünüyor. Aslında elde etmek istiyorum ne

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

bir XmlReader tarafından ayrıştırılır alır hemen önce bir ağ akışı izlemektir. Bu, diğer sorumu>Reading from same SslStream simultaneously? < ile ilgilidir. Bunu nasıl yaparım?

GÜNCELLEME:

Aslında uygulamayı engelliyor Encoding.UTF8.GetString(bytes) olduğunu. Sorunun daha eksiksiz olması için XML akışını okumak için kod listeleme yapıyorum.

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

Neden "Encoding.UTF8.GetString (bytes)" yerine bytes.ToString() 'ı denemiyorsunuz veya bazı temel bilgileri burada mı kaçırıyorum? – Malachi

+3

@Malachi: "ToString()") tarafından üretilen System.Byte [] 'ile ne yapmalıyım? –

+0

Burada yapılması gerekenleri takip ettiğimden emin değilim. 'Console.WriteLine()' sadece byte [] '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'eşdeğerini yazdırmak için söyledikten sonra yazmanız gerekir. 'OnDataRecieved', muhtemelen bir bayt [] 'almalı ve bir dize (' char [] ') değil, benim düşündüğüm şey olmalıdır. Çok yanlış olabilirim. tam olarak ne olduğunu anlamaya çalışmak – Malachi

cevap

1

Yayınladığınız koda göre, StreamCallback() bu akış sona erene kadar engellenir. Bir bayt işaretçisini Encoding.UTF8.GetString (bayt) geçirirsiniz; Bu nedenle, bitene kadar sorgulama bayt tutmak gerekir. Bu akış kapatılıncaya kadar bayt bir akıştan geldiğinden, sonuna asla ulaşmaz.

Akışınızı, belirli bir karakter görünene kadar, bir seferde belirli sayıda baytta işlemden geçirmeniz gerekir.

İlgili konular