gpt4 book ai didi

c# - 递归函数调用抛出 StackOverFlowException

转载 作者:行者123 更新时间:2023-11-30 18:58:52 27 4
gpt4 key购买 nike

我必须递归调用一个函数。但片刻之后它会抛出 StackOverFlowException。当我使用 Invoke(new Action(Start)) 方法时,它会抛出相同的异常,但不会在很长一段时间内抛出,这比前一个要短。

我怎样才能克服这个问题?

示例代码:

private void Start()
{
// run select query
mysql(selectQueryString.ToString());
msdr = mysql();
// is finished
if (!msdr.HasRows)
{
this.Finish();
return;
}
// get mysql fields
string[] mysqlFields = Common.GetFields(ref msdr);
while (msdr.Read())
{
// set lastSelectID
lastSelectID = Convert.ToInt32(msdr[idFieldName].ToString());
// fill mssql stored procedure parameters
for (int i = 0; i < matchTable.Count; i++)
{
string valueToAdd = Common.ConvertToEqualivantString(matchTable[i].Type, matchTable[i].Value, ref msdr, ref id, matchTable[i].Parameters);
sql.Ekle(matchTable[i].Key, valueToAdd);
}
// execute adding operation
lastInsertID = (int)sql(false);
// update status bar
this.UpdateStatusBar();
// update menues
this.UpdateMenues();
// increment id for "{id}" statement
id++;
}
// close data reader
msdr.Close();
msdr.Dispose();
mysql.DisposeCommand();
// increment select limit
selectQueryString.LimitFirst += selectQueryString.LimitLast;
// call itself until finish
this.Start();
}

最佳答案

当函数中的最后一条语句是对函数本身的调用时,您有 tail-recursion.虽然有优化尾递归以避免堆栈溢出异常的语言,但 C# 不是其中之一。

对于任意长度的数据,递归不是一个好的模式。简单地用 while 循环替换递归:

private void Start()
{
while(true) {
// run select query
mysql(selectQueryString.ToString());
msdr = mysql();
// is finished
if (!msdr.HasRows)
{
this.Finish();
break;
}
// rest of your code..
}
}

关于c# - 递归函数调用抛出 StackOverFlowException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18581502/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com