[英]C# StackOverFlow Exception during loop by calling same method again
我有一个控制台应用程序,该应用程序进行API调用并将数据返回到控制台。
我正在使用线程来开始调用API和调用方法来获取最终调用自身的消息。 此示例引发StackOverFlowException。 但是,如果我使用简单的while循环,那么它可以完美地工作。
为什么在第一个代码示例中抛出StackOverFlowException,然后两个不同的方法实际上完成相同的工作?
var thread = new Thread(GetMessagesInternal);
thread.Start();
private static void GetMessagesInternal() { //THROWS STACKOVERFLOWEXCEPTION
var messages = MyProgram.GetMessages();
foreach (var message in messages) {
Console.WriteLine($"{message.MessageText}");
}
GetMessagesInternal();
}
private static void GetMessagesInternal() { //WORKS FINE
while(true) {
var messages = MyProgram.GetMessages();
foreach (var message in messages) {
Console.WriteLine($"{message.MessageText}");
}
}
}
方法要完成所有的操作-包括对自身的调用,才能完成。 该方法每次调用自身时,都会将当前状态压入堆栈,因此返回时可以恢复其状态。
经常这样做,将会使堆栈溢出。
要无限期地重复代码,可以改为在while(true)
循环中进行。
PS。 IL有一个“尾部”方法 ,可以完成您希望代码执行的操作- 完成当前方法并执行另一个方法-但C#语言中未包含该方法。
这个问题。
private static void GetMessagesInternal() //WORKS FINE
{
while(true)
{
var messages = MyProgram.GetMessages();
foreach (var message in messages)
{
Console.WriteLine($"{message.MessageText}");
}
}
这将进入无限循环.GetMessages()方法将被无限调用,您需要在特定条件下打破此循环。
两个片段之间的区别是嵌套。 如果您打自己的电话,则在其他电话结束之前您不会“退出”。
可视化:
-->GetMessagesInternal
--> GetMessagesInternal
--> GetMessagesInternal
--> GetMessagesInternal
--> etc
这将淹没堆栈,每个调用都保留在堆栈上
另一个:
-->GetMessagesInternal
-->GetMessagesInternal
-->GetMessagesInternal
-->GetMessagesInternal
-->etc
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.