While(true)循环在没有任何日志或事件日志的Windows服务中卡住
本文关键字:日志 事件 Windows 服务 任何 true 循环 While | 更新日期: 2023-09-27 17:59:23
我有一个windows服务,它的主要方法包括5个任务:
- 4 System.Timers.Timer()
- 1具有无穷循环的方法While(true)由单独的线程处理
注意:在每个方法执行之前,在.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);
}
}
首先,您需要检查Log
对象是否支持多线程。若它在主线程中工作,并不意味着它同时在另一个线程中工作得很好。当使用多个线程时,您总是需要记住并发性和其他重要规则。至少,您应该将Log
放入lock
语句中(我不知道您的Log
对象的内部结构)。
其次,不要认为Log
没有抛出异常或者catch
块中不存在异常。线程很可能在这里崩溃:
catch (Exception ex)
{
Log.Write("Worker exception : " + ex);
}
第三,出于调试目的,首先尝试最简单、最安全的日志记录。通常,Windows服务会将其事件记录到系统日志中。但它不太适合调试,而是服务"接口"的一部分。尝试使用System.Diagnostics
中的Trace
类。
using System.Diagnostics;
...
catch (Exception ex)
{
Trace.WriteLine("Worker exception : " + ex);
}
对于多线程应用程序,您需要更准确地编写、验证和调试代码的每一步,然后才能认为它按预期工作。在大多数情况下,多线程会显著增加开发的复杂性
创建服务应用程序也不是一项琐碎的任务。例如,强烈反对在Services中使用表单,这会使调试变得复杂。