HI Guys, 我已经创建了一个生成三个线程的Windows服务。第一个线程每15秒唤醒一次,第二个线程每分钟唤醒一次。和第三个线程一天一次。 我的代码看起来像这样:
var timer1 = new Timer();
timer1.Elapsed += ProcessTimerEvent1;
timer1.Interval = 60000;
timer1.Start();
var timer2 = new Timer();
timer2.Elapsed += ProcessTimerEvent2;
timer2.Interval = 15000;
timer2.Start();
var timer3 = new Timer();
timer3.Elapsed += ProcessTimerEvent3;
timer3.Interval = 86400000;
timer3.Start();
从我的事件日志中我可以看到它说.NET Runtime 2.0错误报告EVENTID:5000。
我查看了网络并说出了无效的操作异常。
你们是否认为停止服务是否必须对线程做任何事情。 而另一个愚蠢的问题是我每次都会产生3个新线程,或者相同的线程会在15秒或1分钟内产生。
答案 0 :(得分:2)
可能你的一个主题是抛出未处理的异常。这会让你的过程立即死亡。通过将线程中的代码包装到try-catch-blocks中,确保在某个时刻处理线程内的任何异常(并且不要忘记正确记录以便您可以了解出错的地方)。 / p>
答案 1 :(得分:0)
这可能是由于您的某个活动中的代码出现异常。
答案 2 :(得分:0)
你是否在一些全局(静态)对象上保留了定时器的引用?即使它们仍在运行,如果不是它们,它们也是垃圾收集的候选者。 CG将调用他们的析构函数,然后调用Dispose方法,你的线程将突然停止。
对于secons问题;计时器使用线程池来生成线程。每个处理都将从池中获取一个线程,使用它并释放它。在句点之间,他们只是等待来自系统时钟的通知。
答案 3 :(得分:0)
翘,
您可以使用以下代码向服务添加未处理的异常处理: -
namespace YourNamespace
{
static class Program
{
[STAThread]
static void Main()
{
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
HandleException(e.Exception);
}
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
HandleException((Exception)e.ExceptionObject);
}
static void HandleException(Exception e)
{
//Handle/Log Exception Here
}
}
}
谢谢,
菲尔