我有以下代码(_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循环也不会退出。

10-08 18:14