C# 控制台应用程序中出现堆栈溢出错误
我目前有一个用C#编写的用于生产服务器环境的控制台应用程序。这很简单,但我已经在自己的服务器上测试了+-3个月了(半成品,但如果程序失败,这不是灾难)。不过,每隔几周左右,我就会遇到堆栈溢出错误 当然,将我的整个源代码粘贴到这里将是一个相当长的过程,因此我将尽我所能解释它:程序处于无限while循环中(这可能是问题的原因),它每隔一秒钟检查一些小东西,并每隔一段时间打印到控制台(如果没有活动,每15分钟一次,否则最多每秒一次) 现在,我为什么以及如何修复堆栈溢出错误?能够运行几周而不出现问题似乎很难,但显然不是在服务器生产环境中。我猜这是事实,我正在使用while循环,但我有什么替代方案 编辑:以下是代码的一部分:C# 控制台应用程序中出现堆栈溢出错误,c#,stack-overflow,C#,Stack Overflow,我目前有一个用C#编写的用于生产服务器环境的控制台应用程序。这很简单,但我已经在自己的服务器上测试了+-3个月了(半成品,但如果程序失败,这不是灾难)。不过,每隔几周左右,我就会遇到堆栈溢出错误 当然,将我的整个源代码粘贴到这里将是一个相当长的过程,因此我将尽我所能解释它:程序处于无限while循环中(这可能是问题的原因),它每隔一秒钟检查一些小东西,并每隔一段时间打印到控制台(如果没有活动,每15分钟一次,否则最多每秒一次) 现在,我为什么以及如何修复堆栈溢出错误?能够运行几周而不出现问题似乎
int timeLoop = 0;
while (true)
{
// If it has been +-10min since last read of messages file, read again
if (timeLoop > 599)
{
Console.WriteLine(DateTime.Now.ToString("HH:mm:ss") + " Reading messages...");
messagesFile = File.ReadAllText(@"messages.cfg");
messages = messagesFile.Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
timeLoop = 0;
}
// For each message, check if time specified equals current time, if so say message globally.
foreach (string x in messages)
{
string[] messageThis = x.Split('~');
int typeLoop = 0;
if (messageThis[2] != "no-loop")
typeLoop = Convert.ToInt16(messageThis[2].Remove(0, 5));
DateTime checkDateTime = DateTime.ParseExact(messageThis[0], "HH:mm:ss", null);
if (typeLoop == 0)
{
if (checkDateTime.ToString("HH:mm:ss") == DateTime.Now.ToString("HH:mm:ss"))
publicMethods.sayGlobal(messageThis[1]);
}
else
{
DateTime originalDateTime = checkDateTime;
do
{
checkDateTime = checkDateTime.AddHours(typeLoop);
if (checkDateTime.ToString("HH:mm:ss") == DateTime.Now.ToString("HH:mm:ss"))
publicMethods.sayGlobal(messageThis[1]);
} while (checkDateTime.ToString("HH:mm:ss") != originalDateTime.ToString("HH:mm:ss"));
}
}
timeLoop++;
Thread.Sleep(1000);
}
另外,我忘了我在Github上有这段代码,这可能会有很大帮助。我知道你不应该使用任何代码链接并将它们放在这里,所以这就是我在上面包含代码片段的原因——但是如果你有兴趣帮我解决问题,那么存储库就在这里。另一个注意事项——我知道这样做在时间上不太准确-但目前这不是什么大问题。
BattleEyeClient.Connect
可以在某些(失败)情况下调用自身,并且此方法可以由sayGlobal
调用-因此您可能需要更改此代码块(从第98行开始):
可以跟踪您尝试重新连接的次数或转换这段代码,使其成为while
循环,而不是在此故障模式下的递归调用
当然,更糟糕的是,如果递归的
Connect
调用成功,那么这个catch
块将返回BattlEyeConnectionResult.ConnectionFailed
,它可能不应该返回这个结果。你有堆栈跟踪吗?有任何东西会递归地调用自己吗?如果没有任何代码,这个异常将不会为你修复确认while
循环本身不会导致堆栈溢出。寻找递归调用——while循环不会导致堆栈溢出。尝试打印所调用的内容,无论是哪种方式,控件离开while循环并转到另一个方法,或者初始化的局部变量越来越多mory for?或者你启动了更多的线程,但没有结束,从而限制了每个线程的堆栈空间,直到你遇到错误。真的,我们没有足够的信息来帮助你。我记得大部分时候都看到了stackoverflow错误,所以可能就是这样!谢谢你,我会尝试一下。
catch
{
if (disconnectionType == BattlEyeDisconnectionType.ConnectionLost)
{
Disconnect(BattlEyeDisconnectionType.ConnectionLost);
Connect();
return BattlEyeConnectionResult.ConnectionFailed;
}
else
{
OnConnect(loginCredentials, BattlEyeConnectionResult.ConnectionFailed);
return BattlEyeConnectionResult.ConnectionFailed;
}
}