Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在我的C代码中防止StackoverflowException_C# - Fatal编程技术网

C# 如何在我的C代码中防止StackoverflowException

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

我正在调用一个API,从服务器获取数据。当响应具有nextpageToken时,函数使用pagetoken调用自身

代码运行正常,但它使stackoverflow异常。如果这个东西需要被调用350次(每次使用新的pagetoken调用方法本身),那么它就是makeStackOverflow异常

例如,这就是代码

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