using System.Net.Sockets;
using System.Net.WebSockets;
namespace Fleet.Core;
///
/// 收尾类的等待(关闭、释放、等任务结束)一律要有上限:对端没了、原生层不回调、某个处理器卡住时,
/// 没有上限的等待会让状态机永远停在「已连接」,既不重连也不报错。超时就放弃等待并交给调用方记日志;会话结束时的常见异常按正常噪声吞掉。
///
public static class Bounded
{
/// 收尾的一步最多等这么久。
public static readonly TimeSpan Teardown = TimeSpan.FromSeconds(5);
/// 等 最多 ;超时返回 false(任务继续在后台收尾,不再等它),否则返回 true。
public static async Task WaitAsync(Task work, TimeSpan limit, TimeProvider time)
{
try
{
await work.WaitAsync(limit, time);
return true;
}
catch (TimeoutException)
{
return false;
}
catch (Exception ex) when (ex is OperationCanceledException or IOException or ObjectDisposedException or InvalidOperationException or SocketException or WebSocketException)
{
return true; // 会话结束时的正常噪声:这一步已经结束了
}
}
}