You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在C#中如何为MongoDB文档计数操作设置超时限制?

实现带超时限制的MongoDB计数操作

完全可行,你可以通过结合CancellationTokenSource的超时功能来实现需求,既能在超时后快速返回预设值,又能自动取消未完成的计数任务以节省资源。

以下是具体的C#实现代码:

public async Task<int> GetLimitedTimeoutDocumentCount<T>(
    IMongoCollection<T> collection,
    FilterDefinition<T> filters,
    CancellationToken externalCancellationToken = default)
{
    // 创建绑定外部令牌与超时逻辑的CancellationTokenSource
    using var cts = CancellationTokenSource.CreateLinkedTokenSource(externalCancellationToken);
    // 设置500毫秒超时
    cts.CancelAfter(500);

    try
    {
        // 执行计数操作,使用带超时的令牌
        long documentCount = await collection.CountDocumentsAsync(filters, cancellationToken: cts.Token);
        // 若计数超出int范围,直接返回Int32.MaxValue(可根据业务需求调整)
        return documentCount > int.MaxValue ? int.MaxValue : (int)documentCount;
    }
    catch (OperationCanceledException)
    {
        // 区分超时取消和外部主动取消
        if (!externalCancellationToken.IsCancellationRequested)
        {
            // 超时触发的取消,返回预设值
            return int.MaxValue;
        }
        // 外部主动取消,抛出原异常
        throw;
    }
}

代码说明:

  • 用CancellationTokenSource.CreateLinkedTokenSource绑定外部传入的取消令牌和超时令牌,同时支持外部主动取消和超时自动取消两种场景。
  • cts.CancelAfter(500)设置半秒超时,超时后自动终止计数任务,避免不必要的资源消耗。
  • 捕获OperationCanceledException后判断取消原因:仅超时取消时返回Int32.MaxValue,外部主动取消则抛出原异常,符合常规业务逻辑。
  • 额外处理了计数结果超出int.MaxValue的情况,避免强制转换时溢出(无需的话可移除该判断)。

使用时直接替换原有调用即可:

int count = await GetLimitedTimeoutDocumentCount(yourCollection, yourFilters, cancellationToken);

内容的提问来源于stack exchange,提问作者Brian Kessler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 13:23:29