首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >递归函数调用抛出StackOverFlowException

问递归函数调用抛出StackOverFlowException
EN

Stack Overflow用户
提问于 2013-09-03 06:20:47
回答 1查看 14.3K关注 0票数 2

我必须递归地调用一个函数。但过了一会儿,它抛出了StackOverFlowException。当我使用Invoke(new Action(Start))方法时,它抛出了相同的异常,但不是很长的时间,这比前一个更短。

我该如何克服这个问题呢?

示例代码:

代码语言:javascript
复制
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();
        }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-03 08:54:46

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

对于可以是任意长度的数据,递归不是一个好的模式。只需将递归替换为while循环:

代码语言:javascript
复制
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..
    }
}
票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18581502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档