问题描述
||
我有一个Windows服务,其主要方法包括5个任务:
4 System.Timers.Timer()
1个具有无限循环While(true)的方法,由分离线程处理
N.B:在每种方法执行之前,在.log文件中写有“现在开始发送命令...”之类的描述
昨天检查日志时,我注意到所有4个timers方法均登录到日志文件并执行代码,但是具有无限循环While(true)的方法未记录任何内容。
您能给我关于什么原因导致无限循环的建议吗?
private void StartThread(){
if (_Thread != null){
if (_Thread.IsAlive){
return;
}
}
Log.Write(\"thread started.\");
_Thread = new Thread(SchedulerWorker);
_Thread.IsBackground = true;
_Thread.Name = \"scheduler thread\";
_Thread.Priority = ThreadPriority.Lowest;
_Thread.Start();
}
private void SchedulerWorker(){
while (true){
try{
DoScheduleWork();
}
catch (Exception ex){
Log.Write(\"Worker exception : \" + ex);
}
Thread.Sleep(TIMER_INTERVAL);
}
}
解决方法
首先,您需要检查ѭ1对象是否支持多线程。如果它可以在主线程中工作,并不意味着它可以同时在另一个线程中工作。当使用多个线程时,您始终需要牢记并发和其他重要规则。至少,也许您应该将ѭ1放入
lock
语句中(我不知道Log
对象的内部结构)。
其次,不要以为Log
不会抛出异常或or6ѭ块中不存在异常。线程很可能在这里崩溃:
catch (Exception ex)
{
Log.Write(\"Worker exception : \" + ex);
}
第三,出于调试目的,首先尝试最简单最安全的日志记录。通常,Windows Services将其事件记录到系统日志中。但是它不太适合调试,它是Service \“ interface \”的一部分。尝试使用System.Diagnostics
中的Trace
类。
using System.Diagnostics;
...
catch (Exception ex)
{
Trace.WriteLine(\"Worker exception : \" + ex);
}
对于多线程应用程序,您需要更准确地编写,验证和调试代码的每一步,然后才能认为它可以按预期工作。在大多数情况下,多线程会大大增加开发的复杂性。
创建Service应用程序也不是一件容易的事。例如,强烈建议不要在Services中使用表单,这会使调试复杂化。