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; // 会话结束时的正常噪声:这一步已经结束了 } } }