我目前有一个用C#编写的控制台应用程序用于生产服务器环境。这很简单,但我现在已经在我自己的服务器上进行了3到3个月的测试(半生产,但如果程序失败则不是灾难)。不过,我每隔几周左右就会收到堆栈溢出错误。
当然,在这里粘贴我的整个源代码将是一个很长的篇幅,所以我会尽力解释它:程序处于无限循环中(这可能是问题的原因),它会每隔一秒检查一些小东西,并经常打印到控制台(如果没有活动,每15分钟一次,否则每秒一次)。
现在为什么以及如何解决堆栈溢出错误?能够运行它几周没有问题可能看起来很多,但显然不是在服务器生产环境中。我的猜测是,我正在使用while循环,但我有什么替代方案?
编辑:这是代码的一部分:
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上实际上有这个代码,这可能有很大帮助。我知道你不应该使用任何代码链接并将它们放在这里,所以这就是为什么我把上面的代码片段包含在内 - 但是如果你有兴趣帮我解决这个问题,请找here。另一个注意事项 - 我知道这样做的时间不是很准确 - 但目前这不是一个问题。
答案 0 :(得分:2)
BattleEyeClient.Connect
可以在某些(失败)环境中调用自身,并且sayGlobal
可以调用此方法 - 所以您可能想要更改此代码块(从第98行开始):
catch
{
if (disconnectionType == BattlEyeDisconnectionType.ConnectionLost)
{
Disconnect(BattlEyeDisconnectionType.ConnectionLost);
Connect();
return BattlEyeConnectionResult.ConnectionFailed;
}
else
{
OnConnect(loginCredentials, BattlEyeConnectionResult.ConnectionFailed);
return BattlEyeConnectionResult.ConnectionFailed;
}
}
也许跟踪你做了多少次重新连接尝试或转换这段代码,以便 it 是一个while
循环,而不是在这种失败模式下的递归调用。
当然,更糟糕的是,如果递归Connect
调用成功,则此catch
块会返回BattlEyeConnectionResult.ConnectionFailed
,这可能不应该。{/ p>