【问题标题】:How to prevent StackoverflowException in my C# code如何在我的 C# 代码中防止 StackoverflowException
【发布时间】: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#


【解决方案1】:

使用循环 - 将您的方法分成两部分.. 制作不处理 NextPage Token 的第二个方法,这个新方法只会返回结果。

在“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;
}

【讨论】:

  • 澄清一下,使用pagetoken != null;在页面上,它是空字符串或 null
【解决方案2】:

类似

string pageToken=null;
do { 
    pageToken = Getdata(info, pageToken):
} while (pageToken != null)

【讨论】:

  • 感谢帮助,我这样重写我的代码,问题解决了。
猜你喜欢
  • 2020-11-02
  • 2010-09-17
  • 2011-01-21
  • 1970-01-01
  • 1970-01-01
  • 2021-08-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多