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
只会在流结束时返回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