【发布时间】:2018-03-24 05:36:25
【问题描述】:
我正在调用一个从服务器获取数据的 API。当响应有nextpageToken时,函数调用自己的pagetoken。
代码运行良好,但导致 stackoverflow 异常。如果这个东西需要被调用 350 次(方法每次都用新的 pagetoken 调用自己),它就会导致 stackoverflow 异常。
例如这是代码。
public static void GetData(Channel info, string pagetoken =null)
{
// get the data from api
GetData(info,pagetoken)
// enter into database
return;
}
有人请检查如何解决这个问题。以前我在 Task 中运行了一些子项,但由于 API 命中速度太快而失败,因此我删除了该 Task。
现在它是单线程代码,但仍然不能完美运行。
【问题讨论】:
-
只有一个答案。删除或至少减少递归。不要从函数内部调用太多次函数。 (你的例子是递归的完美例子。)
-
这个递归会在什么条件下结束?我在您的帖子中没有看到任何与此相关的代码?
-
@Adrian,我不确定您是如何以及在何处进行检查的,请发布所有相关代码。我所说的是在 GetData 函数中调用 GetData 之前,您应该检查类似
if (pageToken !=null) GetData()的内容 - 条件只是一个示例 -
为什么函数需要调用自己?你不能只使用一个while循环吗?
-
@Adrian 有两种可能的选择。导致递归的条件是错误的(即使在限制之后也继续),或者太多的数据(太多的递归)。您需要逐步调试它才能找到问题。我个人看不到您的代码或数据,但应始终谨慎使用递归。有(至少在某个时候) 种方法可以在没有递归的情况下做事。抱歉,我现在找不到 C# 中的示例,但至少有一些没有递归的“递归文件扫描”:stackoverflow.com/a/6776380/2826535 使用某种“要获取的数据堆栈”。
标签: c#