控制台应用程序中的堆栈溢出错

时间:2013-11-27 13:38:42

标签: c# stack-overflow

我目前有一个用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。另一个注意事项 - 我知道这样做的时间不是很准确 - 但目前这不是一个问题。

1 个答案:

答案 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>