我有一个带有主要方法的Windows服务,其中包含5个任务:
N.B:在每个方法执行之前,如“立即开始发送命令...”这样的描述写在.log文件中
昨天当我查看日志时,我注意到所有4个计时器方法都登录到日志文件并执行代码,但是带有无限循环的方法虽然(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);
}
}
答案 0 :(得分:1)
首先,您需要检查Log
对象以获得多线程支持。如果它在主线程中工作并不意味着它同时在另一个线程中工作。使用多个线程时,您始终需要牢记并发性和其他重要规则。至少,您可能应该将Log
放入lock
语句中(我不知道您的Log
对象的内部结构。)
其次,不要认为Log
不会抛出catch
块中不存在异常或异常。很可能线程在这里崩溃了:
catch (Exception ex)
{
Log.Write("Worker exception : " + ex);
}
第三,首先尝试最简单,最安全的日志记录,以便进行调试。通常,Windows服务将其事件记录到系统日志中。但它不太适合调试,它更像是服务“接口”的一部分。尝试使用Trace
中的System.Diagnostics
课程。
using System.Diagnostics;
...
catch (Exception ex)
{
Trace.WriteLine("Worker exception : " + ex);
}
对于多线程应用程序,您需要更准确地编写,验证和调试代码的每一步,然后才能认为它按预期工作。在大多数情况下,多线程显着增加了开发的复杂性。
创建服务应用程序也不是一件轻而易举的事。例如,强烈建议不要在服务中使用表单,这会使调试变得复杂。