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

While(true)循环在没有任何日志或事件日志的Windows服务中卡住

首先,您需要检查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中使用表单,这会使调试变得复杂。