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

如何中止执行时长超过3秒的IsMagicNumber递归函数?

解决方案

要实现对IsMagicNumber的执行超时控制,核心思路是将同步递归任务放到独立执行单元中,并设置超时阈值,超时则判定为false并继续下一个数字的测试。以下分两种场景给出实现方案:

场景1:无法修改IsMagicNumber原函数

如果不能改动原递归函数的代码,可以用Task.Run将其包装为异步任务,通过Task.Wait(int millisecondsTimeout)实现超时等待:

for (int i = 0; i < 1000; i++)
{
    // 捕获当前循环变量,避免闭包引用问题
    int currentNum = i;
    // 将同步函数包装为后台任务
    var magicTask = Task.Run(() => IsMagicNumber(currentNum));
    
    // 等待最多3秒,返回值表示任务是否在超时前完成
    if (magicTask.Wait(3000))
    {
        // 任务正常完成,输出结果
        Console.WriteLine(magicTask.Result);
    }
    else
    {
        // 超时,输出false并继续下一个数字
        Console.WriteLine(false);
        // 注意:原递归任务可能仍在后台运行(无法强制终止),若需严格控制资源,建议优先采用场景2方案
    }
}

场景2:可以修改IsMagicNumber原函数

如果能修改递归函数,推荐加入CancellationToken支持,这样可以在超时后真正中止递归执行,避免资源浪费:

第一步:修改IsMagicNumber支持取消信号

在递归的关键节点(比如每次递归调用前)检查取消信号:

bool IsMagicNumber(int n, CancellationToken cancellationToken)
{
    // 检查是否收到取消请求,若有则抛出异常终止递归
    cancellationToken.ThrowIfCancellationRequested();
    
    // 原递归逻辑代码...
    // 示例递归调用(需传递取消令牌):
    // return IsMagicNumber(nextValue, cancellationToken);
}

第二步:修改循环逻辑,设置超时自动取消

for (int i = 0; i < 1000; i++)
{
    int currentNum = i;
    // 创建取消令牌源,设置3秒后自动触发取消
    using var cancellationSource = new CancellationTokenSource(3000);
    
    try
    {
        // 执行带取消令牌的递归函数
        bool result = IsMagicNumber(currentNum, cancellationSource.Token);
        Console.WriteLine(result);
    }
    catch (OperationCanceledException)
    {
        // 捕获取消异常,输出false
        Console.WriteLine(false);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 07:34:59