gpt4 book ai didi

c# - 使用 NetworkStream.BeginRead() 获取 IOException

转载 作者:行者123 更新时间:2023-11-30 17:00:52 26 4
gpt4 key购买 nike

运行这段代码时:

private async void StartChat(Object obj)
{
TcpClient me = (TcpClient)obj;
UpdateChatBox("Attempting read from server.");
myBuffer = new byte[BUFFER_SIZE];

while (true)
{
var myStream = me.GetStream();
myStream.BeginRead(myBuffer, 0, BUFFER_SIZE, new AsyncCallback(UpdateChatBoxAsync), myStream);

if (messageToSend)
{
await myStream.WriteAsync(myMessage, 0, myMessage.Length);
}
}
}

我从 BeginRead 收到以下 IO 异常:

Unable to read data from the transport connection: An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full.

这里是BeginRead的回调方法:

private void UpdateChatBoxAsync(IAsyncResult result)
{
var stream = result.AsyncState as NetworkStream;
int bytesRead = stream.EndRead(result);

if (bytesRead > 0)
{
String newMessage = NetworkUtils.GetString(myBuffer);
UpdateChatBox(newMessage);
}
}

有人可以阐明引发此异常的原因吗?我尝试在 while 循环开始时每次都重新创建缓冲区,但虽然这不会引发异常,但我不会从服务器接收消息。

我还尝试在 UpdateChatBoxAsync 结束时将 myBuffer 重置为一个空数组,这也没有用。

如有任何帮助,我们将不胜感激。

最佳答案

您正在运行一个没有任何限制的无限循环。您发出异步读取调用的速度与 CPU 的速度一样快。这会产生无限量的未完成操作。

您应该在最后一次读取完成后发出下一次读取(最常见的是通过回调完成)。

只需添加

if (myStream.DataAvailable)

你避免了读取但仍然烧毁了一个 CPU 内核。这只是其中一种症状的缓解。而是修复根本原因。

看来您根本不应该执行异步 IO,因为您没有阻塞问题。您正在阻塞线程并燃烧 100% 的核心。如果那是可以接受的,甚至不必为异步 IO 而烦恼。

或者,使用 await ReadAsync

关于c# - 使用 NetworkStream.BeginRead() 获取 IOException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21652297/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com