【问题标题】:Process is terminated due to StackOverflowException进程因 StackOverflowException 而终止
【发布时间】:2010-12-15 11:10:06
【问题描述】:

这种情况很难解释。有一个启动 2 个线程的服务进程,每个线程永远循环,但一旦负载完成,每个线程都会休眠 5 分钟。

问题是我的第二个线程在负载完成之前就终止了,没有明显的原因,而且我也无法捕获异常,因为它似乎是从委托进程外部触发的?

关于如何找到问题的任何建议?

代码....

public void StartService()
{
  ThreadStart stRecieve = new ThreadStart(DownloadNewMail);
  ThreadStart stSend = new ThreadStart(SendNewMail);
  senderThread = new Thread(stRecieve);
  recieverThread = new Thread(stSend);

  sendStarted = true;
  recieveStarted = true;

  senderThread.Start();
  recieverThread.Start();
}

private void DownloadNewMail()
{
  while(recieveStarted)
  {
    //Payload....

    if (recieveStarted)
    {
      Thread.Sleep(new TimeSpan(0, confSettings.PollInterval, 0));
    }
  }
}

private void SendNewMail()
{
  while(sendStarted)
  {
    //Payload....

    if (sendStarted)
    {
      Thread.Sleep(new TimeSpan(0, confSettings.PollInterval, 0));
    }
  }

}

【问题讨论】:

  • A StackOverflowException 通常是由递归太深或循环实例化引起的。你在任何地方都使用递归吗?
  • "每个线程永远循环"
  • 已经设法通过将线程创建为静态来解决它...
  • @Jan 这听起来像是埋葬问题而不是解决问题......
  • @Jan de Jader,您发布的代码运行良好。可能问题出在“//PayLoad...”块或其他任何地方...

标签: c# multithreading windows-services


【解决方案1】:

尝试检查代码中的调用堆栈长度:

class Program
{
    static void Main(string[] args)
    {
        try
        {
            Hop();
        }
        catch (Exception e)
        {
            Console.WriteLine("Exception - {0}", e);
        }
    }

    static void Hop()
    {
        CheckStackTrace();
        Hip();
    }

    static void Hip()
    {
        CheckStackTrace();
        Hop();
    }

    static void CheckStackTrace()
    {
        StackTrace s = new StackTrace();
        if (s.FrameCount > 50)
            throw new Exception("Big stack!!!!");
    }
}

【讨论】:

    【解决方案2】:

    如果您在跟踪应用程序代码执行流程时遇到问题,请尝试使用时间戳和线程 ID 记录方法的入口。

    此外,您无法捕获异常,因为它是 StackOverflowException。

    见msdn:“从.NET Framework 2.0版本开始,StackOverflowException对象不能被try-catch块捕获,相应的进程默认终止。因此,建议用户编写代码来检测和防止堆栈溢出。例如,如果您的应用程序依赖于递归,请使用计数器或状态条件来终止递归循环。"

    【讨论】:

    • 我记得在 MSDN 上看到那篇文章并想“哇……人们捕捉 StackOverflowExceptions 是为了摆脱递归循环吗?!”
    【解决方案3】:

    您是否为 DownloadNewMail 和 SendNewMail 之类的任务使用任何重量级库?例如,我在使用 Microsoft.SqlServer.Dts.Runtime.Package 运行大型作业时遇到了 StackOverflows。尝试在命令行应用程序中按顺序运行相同的工作负载,看看问题是否仍然存在。

    【讨论】:

    • 正如建议的那样,对于一个简单的线程来说,有效负载似乎非常重。我正在寻找 Quatz 工作......虽然在 .NET 4.0 中使用它似乎存在问题
    猜你喜欢
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 2018-09-06
    • 2014-11-18
    • 1970-01-01
    相关资源
    最近更新 更多