Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 控制台应用程序中出现堆栈溢出错误_C#_Stack Overflow - Fatal编程技术网

C# 控制台应用程序中出现堆栈溢出错误

C# 控制台应用程序中出现堆栈溢出错误,c#,stack-overflow,C#,Stack Overflow,我目前有一个用C#编写的用于生产服务器环境的控制台应用程序。这很简单,但我已经在自己的服务器上测试了+-3个月了(半成品,但如果程序失败,这不是灾难)。不过,每隔几周左右,我就会遇到堆栈溢出错误 当然,将我的整个源代码粘贴到这里将是一个相当长的过程,因此我将尽我所能解释它:程序处于无限while循环中(这可能是问题的原因),它每隔一秒钟检查一些小东西,并每隔一段时间打印到控制台(如果没有活动,每15分钟一次,否则最多每秒一次) 现在,我为什么以及如何修复堆栈溢出错误?能够运行几周而不出现问题似乎

我目前有一个用C#编写的用于生产服务器环境的控制台应用程序。这很简单,但我已经在自己的服务器上测试了+-3个月了(半成品,但如果程序失败,这不是灾难)。不过,每隔几周左右,我就会遇到堆栈溢出错误

当然,将我的整个源代码粘贴到这里将是一个相当长的过程,因此我将尽我所能解释它:程序处于无限while循环中(这可能是问题的原因),它每隔一秒钟检查一些小东西,并每隔一段时间打印到控制台(如果没有活动,每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上有这段代码,这可能会有很大帮助。我知道你不应该使用任何代码链接并将它们放在这里,所以这就是我在上面包含代码片段的原因——但是如果你有兴趣帮我解决问题,那么存储库就在这里。另一个注意事项——我知道这样做在时间上不太准确-但目前这不是什么大问题。

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