抱歉对编程有点新意,希望你能帮忙解决这个问题。
我意识到这个异常已被覆盖了很多,我已经做了一些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();
}
}
}
答案 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();
}
}