在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
相关产品推荐
相关产品推荐

