c# - ReadAsync 停止代码执行,不抛出异常,Task 仍在运行
问题描述
因此,我使用 TcpClient 类通过我的 C# 程序连接到代理服务器。我建立连接并使用 ReadAsync 方法继续从服务器读取到缓冲区。但是当代理设备断开连接时,ReadAsync 方法似乎进入了一个循环,并且没有进一步的代码正在处理。有趣的是,没有抛出异常,Task 仍然继续工作(在 Listen() 调用中放置 await 会阻止进一步执行,即使设备断开连接也是如此)。
代码:
public async Task Listen()
{
try
{
await server.ConnectAsync(ServerIP, ServerPort);
if (server.Connected)
{
using (NetworkStream stream = server.GetStream())
{
while (server.Connected)
{
try
{
byte[] buffer = new byte[server.ReceiveBufferSize];
int length = await stream.ReadAsync(buffer, 0, buffer.Length);
}
catch(Exception e)
{
server.Close();
}
}
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
server.Close();
}
}
有谁知道如何检测设备何时断开连接,以便我进一步处理?代理服务器不会关闭,它只是停止发送数据。
解决方案
如果连接的代理端被钳制关闭,则可能发生这种情况 - 即,在没有向您的应用程序发送指示它已关闭的数据包的情况下关闭。这使连接处于半开状态。
您需要设计您的应用程序来处理这个问题。最好的方法是让每一方定期发送一个“心跳”或“保活”数据包。如果您的代理协议支持这一点,那将是理想的。否则,您可能需要使用超时;只需设置一个计时器(每个连接一个),每次接收数据时重置它,并在计时器触发时关闭您的套接字。
推荐阅读
- java - Android,Picasso - 大多数图像都不想加载(Kotlin)
- laravel-5 - 为什么我在 laravel 5.5 项目中有不支持的 fsevents 错误平台
- perl - 当 xmlns 存在时,XML::LibXML findnodes() 不返回结果
- java - 带有 IllegalArgumentException 构造函数的数组构造函数
- linux - 检查当前内核以进行自动驱动程序编译
- javascript - 如果某些用户已经打开了 HTML 离线文件,则在网络计算机上只读
- gnuplot - gnuplot:在绘图点后面绘制网格,在前面绘制网格
- c# - WebClient 在下载时使我的应用程序冻结(无响应)。为什么?
- php - while 循环传递不同的值,但 ajax 只会获得第一个值
- codenameone - 创建一个漂亮的 Codename One 滑块以通知百分比