StackOverflow异常解决(间歇性 - 抛出前3-4小时)?

时间:2015-06-12 13:36:53

标签: c# c#-4.0

抱歉对编程有点新意,希望你能帮忙解决这个问题。

我意识到这个异常已被覆盖了很多,我已经做了一些googling / stackoverflow搜索试图找到解决方法。

我运行超过3-4小时的代码似乎只产生异常?该程序将永久循环。我有一个PHP页面,它将发布的数据链接到一个工作正常的SQL页面。

有人可以查看我的编码并为我推荐一种防止/避免stackoverflow异常的方法吗?程序需要循环并且每隔几秒运行一次,以便SQL数据库保持最新。

非常感谢任何帮助。

也很抱歉代码转储,不完全确定哪个部分有问题,如果不是全部! :)

using System;
using System.Diagnostics;
using System.Xml.Linq;
using System.Net;

namespace ClientApp
{
class Program
{
    static void Main(string[] args)
    {
        Console.Title = "Client";
        CheckOnline();
    }
    private static void CallCheckOnline()
    {
        CheckOnline();
    }
    private static void CheckOnline()
    {
        try
        {
            PerformanceCounter cpuCounter;
            cpuCounter = new PerformanceCounter();
            cpuCounter.CategoryName = "Processor";
            cpuCounter.CounterName = "% Processor Time";
            cpuCounter.InstanceName = "_Total";
            cpuCounter.NextValue();
            System.Threading.Thread.Sleep(1000);
            int CPUCounter = (int)cpuCounter.NextValue();

            XElement xml = new XElement("Client");
            XElement hostname = new XElement("hostname", Dns.GetHostName());
            XElement status = new XElement("status", "Online");
            XElement counter = new XElement("counter", CPUCounter.ToString() + "%");

            xml.Add(hostname);
            xml.Add(status);
            xml.Add(counter);

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost/receiver.php");
            request.Method = "POST";
            xml.Save(request.GetRequestStream());
            HttpWebResponse resp = request.GetResponse() as HttpWebResponse;
            System.Threading.Thread.Sleep(4000);
        }
        catch (Exception Ex)
        {
            Console.WriteLine("General Exception Occurred");
            Console.WriteLine("Packed Message: " + Ex.Message);
            Console.Write("Call Stack: " + Ex.StackTrace);
            System.Threading.Thread.Sleep(4000);
        }
        CallCheckOnline();
    }
}

}

2 个答案:

答案 0 :(得分:1)

CheckOnline方法结束时,您正在调用CallCheckOnline(),它再次调用相同的方法(CheckOnline)。这是一个无限递归,必然会遇到StackOverflow异常。您没有立即遇到此异常的唯一原因是使用Thread.Sleep的延迟以及可能更长的实际例程执行时间。

您似乎正在尝试定期执行操作。您应该搜索Timers。它有很多用于互联网的例子。如果此过程必须在后台连续执行,也请考虑制作Windows服务应用程序。

答案 1 :(得分:1)

一种无休止地呼唤自己的方法会导致这种情况。最好在循环内调用CheckOnline()并删除调用CheckOnline()使其自身。

试试这个:

static void Main(string[] args)
{
    Console.Title = "Client";
    while(true)
    {
        CheckOnline();
    }
}