c#websocket心跳包自定义实现,支持异步操作的取消
如果心跳服务是一个周期性任务(如定时发送 Ping 包),不提供取消机制会导致任务持续运行,即使应用程序已经准备关闭。是一个令牌,允许你请求取消操作,而具体的操作逻辑需要检查这个令牌并决定如何响应。这是一种常见的模式,用于在需要时优雅地终止长时间运行的任务(如心跳服务)。这是实现可取消异步操作的标准做法,是编写健壮、可维护代码的关键。遵循.NET 的最佳实践,长时间运行的异步方法应该接受。),应将
public async Task StartAsync()
{
_cancellationTokenSource = new CancellationTokenSource();
CancellationToken token = _cancellationTokenSource.Token;
_heartbeatManager.StartHeartbeatService(token);
为什么要传TOKEN
在 C# 中,将CancellationToken传递给StartHeartbeatService方法是为了支持异步操作的取消。这是一种常见的模式,用于在需要时优雅地终止长时间运行的任务(如心跳服务)。
为什么需要传递 CancellationToken?
-
协作式取消机制
C# 中的异步操作不会被强制终止,而是通过协作式取消实现。CancellationToken是一个令牌,允许你请求取消操作,而具体的操作逻辑需要检查这个令牌并决定如何响应。 -
避免资源泄漏
如果心跳服务是一个周期性任务(如定时发送 Ping 包),不提供取消机制会导致任务持续运行,即使应用程序已经准备关闭。这可能导致资源泄漏或异常行为。 -
与其他异步操作保持一致
遵循.NET 的最佳实践,长时间运行的异步方法应该接受CancellationToken参数,以便与其他异步 API(如Task.WhenAny、Task.Delay等)协同工作。
示例:心跳服务如何使用 CancellationToken
假设StartHeartbeatService的实现如下:csharp
public async Task StartHeartbeatService(CancellationToken cancellationToken)
{
while (!cancellationToken.IsCancellationRequested)
{
try
{
// 发送心跳包
await SendHeartbeatAsync();
// 等待指定间隔后再次发送
await Task.Delay(HeartbeatInterval, cancellationToken);
}
catch (OperationCanceledException)
{
// 任务被取消,正常退出
Console.WriteLine("心跳服务已取消");
}
catch (Exception ex)
{
// 处理其他异常
Logger.LogError(ex, "心跳服务异常");
}
}
}
调用方如何触发取消?
在你的代码中,_cancellationTokenSource是一个类成员变量,因此可以在其他方法中触发取消:
// 启动服务
public async Task StartAsync()
{
_cancellationTokenSource = new CancellationTokenSource();
await _heartbeatManager.StartHeartbeatService(_cancellationTokenSource.Token);
}
// 停止服务
public void Stop()
{
_cancellationTokenSource?.Cancel();
_cancellationTokenSource?.Dispose();
_cancellationTokenSource = null;
}
最佳实践
-
传递令牌到所有子操作
如果StartHeartbeatService内部调用其他支持取消的异步方法(如Task.Delay、HttpClient.SendAsync),应将令牌传递给它们,确保整个操作链都能响应取消请求。 -
定期检查令牌状态
在循环或长时间运行的操作中,定期检查cancellationToken.IsCancellationRequested,以便在没有等待操作时也能响应取消。 -
异常处理
捕获OperationCanceledException以优雅地处理取消请求,避免将其视为错误。
总结
传递CancellationToken的目的是让心跳服务能够:
- 在应用程序关闭时安全停止。
- 在需要时(如检测到连接断开)主动终止。
- 避免资源泄漏和孤儿任务。
这是实现可取消异步操作的标准做法,是编写健壮、可维护代码的关键。
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)