gpt4 book ai didi

c# - 为什么 Console.WriteLine() 会阻止来自 Stream.ReadAsync() 的回调?

转载 作者:太空狗 更新时间:2023-10-29 17:59:24 25 4
gpt4 key购买 nike

我有一个回调函数,我试图在其中写入我在覆盖的 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? <.我该怎么做?

更新:

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

最佳答案

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

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

关于c# - 为什么 Console.WriteLine() 会阻止来自 Stream.ReadAsync() 的回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18406740/

25 4 0