ReadAsync退出,无法在调试中跟踪

本文关键字:调试 跟踪 退出 ReadAsync | 更新日期: 2023-09-27 18:15:14

我有以下代码(_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退出,无法在调试中跟踪

ReadAsync只会在流结束时返回0。这就是所有流的工作原理。如果流没有结束(即,对于套接字流,套接字仍然打开),则ReadAsync将(异步)等待流读取更多字节或结束。

我假设套接字的另一端只是挂着打开,但没有发送任何更多的数据。在这种情况下,任何流读取都将等待它发送更多字节或关闭。没有例外——这不是一个例外的情况。由于套接字未关闭,流读取将不会返回0,因此您的while循环将不会退出。

您可以将对ReadAsync的调用包装在try/catch语句中,或者检查任务的结果。我会采用try/catch方法,至少可以看到最初发生了什么。

try { var asyncReader = await stream.ReadAsync(readBuffer, 0, readBuffer.Length); }
catch (Exception ex) { }

其他方法如下,但你不能确定异常发生时ReadAsync是否优雅地结束。

var task = stream.ReadAsync(readBuffer, 0, readBuffer.Length);
task.Start();
if (task.Exception != null)
   // see what's going here