虽然(true)循环卡在Windows服务中而没有任何日志或eventLog

时间:2011-06-16 15:39:09

标签: c# windows-services

我有一个带有主要方法的Windows服务,其中包含5个任务:

  • 4 System.Timers.Timer()
  • 1 infinit loop的方法while(true)由分离线程处理

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);
        }
    }

1 个答案:

答案 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);
   }

对于多线程应用程序,您需要更准确地编写,验证和调试代码的每一步,然后才能认为它按预期工作。在大多数情况下,多线程显着增加了开发的复杂性。

创建服务应用程序也不是一件轻而易举的事。例如,强烈建议不要在服务中使用表单,这会使调试变得复杂。