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