C# 如何在我的C代码中防止StackoverflowException
我正在调用一个API,从服务器获取数据。当响应具有nextpageToken时,函数使用pagetoken调用自身 代码运行正常,但它使stackoverflow异常。如果这个东西需要被调用350次(每次使用新的pagetoken调用方法本身),那么它就是makeStackOverflow异常 例如,这就是代码C# 如何在我的C代码中防止StackoverflowException,c#,C#,我正在调用一个API,从服务器获取数据。当响应具有nextpageToken时,函数使用pagetoken调用自身 代码运行正常,但它使stackoverflow异常。如果这个东西需要被调用350次(每次使用新的pagetoken调用方法本身),那么它就是makeStackOverflow异常 例如,这就是代码 public static void GetData(Channel info, string pagetoken =null) { // get the data from api
public static void GetData(Channel info, string pagetoken =null)
{
// get the data from api
GetData(info,pagetoken)
// enter into database
return;
}
有人请检查一下如何解决这个问题。以前我在任务中运行了一些子任务,但失败了,因为API命中太快,所以我删除了该任务
现在它是单线程代码,但仍然不能很好地工作。使用循环将方法分为两部分。。 创建第二个不处理下一页标记的方法。此新方法将只返回结果 在“GetData”方法中,您可以执行以下操作
public static void GetData(Channel info, string pagetoken =null)
{
// get the data from api
var result = GetResultFromServer(info,pagetoken);
while(result != null)
{
//handle content of one page
//
// do something with one page.. add it to a result list or whatever
// you have to do
//
if(result.nextPageToken != null)
{
var result = GetResultFromServer(info,result.nextPageToken )
}
else{result = null}
}
// enter into database
return;
}
差不多
string pageToken=null;
do {
pageToken = Getdata(info, pageToken):
} while (pageToken != null)
答案只有一个。移除或至少减少递归。不要从函数中多次调用函数。(您的示例是递归的完美示例。)基于什么条件,此递归将结束?我在你的帖子中没有看到任何与此相关的代码?@Adrian,我不确定你是如何以及在哪里进行检查的,请发布所有相关代码。我想说的是,在GetData函数中调用GetData之前,您应该检查类似以下内容:if(pageToken!=null)GetData()-该条件只是一个示例,为什么函数需要调用自身?你就不能用while循环吗?@Adrian有两种可能的选择。导致递归的条件是错误的(即使在限制之后也会继续),或者数据太多(递归太多)。您需要一步一步地调试它以发现问题。我个人不了解代码或数据,但递归应始终小心使用。有(至少有时)方法可以避免递归。很抱歉,我现在找不到C#中的示例,但至少有一些没有递归的“递归文件扫描”:使用某种“要获取的数据堆栈”。感谢帮助,我像这样重写了代码,问题解决了。只是澄清一下,使用pagetoken!=无效的在页面上,它是空字符串或null