9

我有一个回调函数,我试图在其中写入我在重写的 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 解析网络流之前对其进行监控。这与我的另一个问题有关 >同时从同一个 SslStream 中读取?<. 我该怎么做?

更新

实际上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:
...
4

1 回答 1

1

根据您发布的代码, StreamCallback() 将阻塞,直到该流结束。您将字节指针传递给 Encoding.UTF8.GetString(bytes); 因此,它需要不断地查询字节,直到它到达末尾。它永远不会结束,因为字节来自流,直到该流关闭。

您需要一次处理您的流一定数量的字节,或者直到看到某个字符。

于 2013-11-15T00:03:41.837 回答