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:
...
dlaczego nie wypróbujesz 'bytes.ToString()' zamiast 'Encoding.UTF8.GetString (bytes)' lub czy brakuje mi tutaj pewnych podstaw? – Malachi
@Malachi: Co powinienem zrobić z 'System.Byte []' (który jest produkowany przez 'ToString()'), a następnie? –
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