9
我有一個回調函數,我試圖寫一個覆蓋ReadAsync()中讀取的數據。爲什麼Console.WriteLine()阻塞從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);
}
}
重寫ReadAsync()如下所示。
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;
}
我真正想要實現的是在XmlReader解析之前監視網絡流。這涉及到我的其他問題>Reading from same SslStream simultaneously? <。我會怎麼做?
UPDATE:
它實際上是Encoding.UTF8.GetString(bytes)
正在阻止該應用程序。爲了使問題更加完整,我列出了讀取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:
...
你爲什麼不嘗試使用'bytes.ToString()'而不是'Encoding.UTF8.GetString(bytes)'或者我在這裏丟失了一些基礎知識? – Malachi
@Malachi:我應該如何處理'System.Byte []'(由'ToString()'產生)呢? –
我不確定我是否按照應該在這裏完成的工作。 'Console.WriteLine()'應該只寫出'byte []',以便告訴它將'byte []'等同於'char []'打印出來不應該改變你在那裏做什麼?你的'OnDataRecieved'應該可能採用'byte []'而不是字符串('char []')就是我所想的。我可能是非常錯誤的。只是試圖瞭解究竟是怎麼回事 – Malachi