我有以下代码(_ns
是NetworkStream)
await GetResponse(_ns);
btnSend.Enabled = true;
private async Task GetResponse(NetworkStream stream)
{
while (true)
{
var readBuffer = new byte[4096];
var asyncReader = await stream.ReadAsync(readBuffer, 0, readBuffer.Length);
txtBoxMessagesIn.Text += Encoding.ASCII.GetString(readBuffer.ToArray()) + Environment.NewLine;
if (asyncReader <= 0) break;
}
}
我似乎用期望值填充了整个缓冲区,但是从未启用btnSend。
当我在调试模式下运行它时,我的while循环运行了几次,我看到
asyncReader
设置为不同的值,但是它不会等于0打破循环,正如我所期望的那样,它只是在该行退出:var asyncReader = await stream.ReadAsync(readBuffer, 0, readBuffer.Length);
不会产生任何错误。是什么原因造成的?我是否需要在Visual Studio中进行设置以打破这种类型的错误?
最佳答案
ReadAsync
仅在流结束时返回0
。这就是所有流的工作方式。如果流尚未结束(即,对于套接字流,套接字仍处于打开状态),则ReadAsync
将(异步)等待该流读取更多字节或结束。
我假设套接字的另一端只是悬空打开,而不发送更多数据。在这种情况下,任何流读取都只会等待它发送更多字节或关闭。没有例外-这不是例外情况。由于未关闭套接字,因此读取的流不会返回0
,因此您的while
循环也不会退出。