whiletrue循环卡在Windows Service中,而没有任何日志或eventLog

问题描述

|| 我有一个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中使用表单,这会使调试复杂化。