递归函数调用抛出StackOverFlowException

我要以递归方式调用函数。 但过了一会儿就抛出了StackOverFlowException。 当我使用Invoke(new Action(Start))方法时,它抛出相同的exception,但不会在很长一段时间内抛出,这比前一个短。

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

示例代码:

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(); } 

当函数中的最后一个语句是对函数本身的调用时,你有尾递归。 虽然有些语言可以优化尾递归以避免堆栈溢出exception,但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.. } }