Files
MoShiro/backend/fleet/src/Fleet.Core/Bounded.cs
T
justme d95acc6575
ci/woodpecker/push/web-build Pipeline was successful
ci/woodpecker/push/verify Pipeline was successful
ci/woodpecker/push/dev-image Pipeline was successful
refactor(link): bound every teardown and handler wait behind one helper [CI]
2026-10-19 10:07:36 +08:00

33 lines
1.3 KiB
C#

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