如何中止执行时长超过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
相关产品推荐
相关产品推荐

