首页
/ Cocona项目中如何通过ICoconaAppContextAccessor获取CancellationToken

Cocona项目中如何通过ICoconaAppContextAccessor获取CancellationToken

2025-06-24 19:43:01作者:邓越浪Henry

在Cocona命令行应用程序开发中,正确处理取消请求(如用户按下Ctrl+C)是一个常见需求。本文将详细介绍如何在Cocona框架中获取和使用CancellationToken,特别是在使用AddCommands方式注册命令时。

背景介绍

Cocona是一个.NET平台的命令行应用程序框架,它提供了简洁的API来构建命令行工具。在实际开发中,我们经常需要处理异步操作的中断请求,这时就需要使用CancellationToken。

获取CancellationToken的两种方式

Cocona提供了两种主要方式来获取CancellationToken:

  1. 直接注入方式(适用于AddCommand): 可以通过方法参数直接注入CoconaAppContext或CancellationToken。

  2. 服务访问方式(适用于AddCommands): 通过注入ICoconaAppContextAccessor服务来间接获取。

使用ICoconaAppContextAccessor

当使用AddCommands方式注册命令时,推荐使用ICoconaAppContextAccessor来获取CancellationToken。以下是典型用法示例:

[Command("Hello")]
public async Task HelloCmd([FromService] ICoconaAppContextAccessor contextAccessor)
{
    var ctx = contextAccessor.Current ?? throw new InvalidOperationException();
    while (!ctx.CancellationToken.IsCancellationRequested)
    {
        Console.WriteLine("Hello world!");
        await Task.Delay(100);
    }
}

这段代码展示了如何:

  1. 通过[FromService]特性注入ICoconaAppContextAccessor
  2. 获取当前的CoconaAppContext实例
  3. 访问其中的CancellationToken属性
  4. 在循环中检查取消请求

最佳实践建议

  1. 空值检查:虽然不常见,但contextAccessor.Current可能为null,应该进行防御性编程。

  2. 及时响应取消:在长时间运行的操作中,应该定期检查IsCancellationRequested状态。

  3. 资源清理:当检测到取消请求时,应该妥善清理已分配的资源。

  4. 异常处理:考虑捕获OperationCanceledException来处理取消操作。

实际应用场景

这种方法特别适用于以下场景:

  • 长时间运行的批处理操作
  • 需要定期轮询的服务
  • 需要优雅退出的后台任务
  • 需要响应外部中断的交互式命令行工具

通过这种方式,开发者可以轻松实现命令行应用的优雅退出功能,提升用户体验和应用程序的健壮性。

登录后查看全文
热门项目推荐
相关项目推荐