【问题标题】:Windows service running not doing anythingWindows 服务运行不做任何事情
【发布时间】:2020-01-14 09:47:44
【问题描述】:

我的服务正在运行,但它没有执行我在 OnStart 中插入的任何逻辑, 另外,我尝试将消息记录到事件查看器,但它甚至没有到达那部分(我假设它在 OnStart 之前下降..) 有人可以告诉我我做错了什么吗?谢谢,

 public partial class DSGService : ServiceBase
    {
        private static string ftpPath = ConfigurationManager.AppSettings["FtpPath"];
        private Timer _timer;
        private bool _isRunning;

        public DSGService()
        {
            InitializeComponent();
            AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;

        }

        private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            WriteToEventViewer("error!:" + e.ExceptionObject.ToString());
        }

OnStart 逻辑

        protected override void OnStart(string[] args)
        {
            _isRunning = false;
            _timer = new Timer
            {
                AutoReset = true,
                Interval = 5000,

            };
            _timer.Elapsed += new ElapsedEventHandler(this.TimerElapsed);
            _timer.Start();
        }

做事的代码

        private void TimerElapsed(object sender, ElapsedEventArgs e)
        {
            if (_isRunning)
            {
                WriteToEventViewer("isrunning is true");
                return;
            }

            try
            {
                _isRunning = true;
                WriteToEventViewer("started");
                //do things..
                    WriteToEventViewer("generated!");
                }

            }
            finally
            {
                _isRunning = false;
                WriteToEventViewer("done");
            }
        }
        private void GenerateAndPublishData(ServerData server)
        {
            try
            {
//do things...

            }
            catch (Exception ee)
            {
                WriteToEventViewer(string.Format("error: {0}", ee);
            }
        }
        protected override void OnStop()
        {

            _timer.Stop();
            _timer.Dispose();
            _timer = null;
                    }

写入事件查看器

        private void WriteToEventViewer(string msg)
        {
            using (EventLog eventLog = new EventLog("DSGService"))
            {
                eventLog.Source = "DSGService";
                eventLog.WriteEntry(msg, EventLogEntryType.Information, 101, 1);
            }
        }
    }```

【问题讨论】:

标签: c# .net windows-services


【解决方案1】:

这可能是TimerElapsed 方法内部异常的结果,它阻止了计时器重新启动。为了避免这种情况,您可以这样做:

  1. 将计时器的AutoReset 属性设置为false

  2. TimerElapsed 事件处理程序中,在finally 子句中,再次启动计时器。

这意味着即使您的TimerElapsed 事件处理程序发生异常,计时器也会重新启动。

【讨论】:

  • 既然一切都完成了,那么设置一个布尔值并调用WriteToEventViewer,我的赌注是WriteToEventViewer 方法,它在try 块之前被调用。因此,OP 可能还想加强该方法本身。
  • System.Diagnostics.EventLog 需要提升权限(请参阅docs.microsoft.com/en-us/dotnet/api/…),因此它可能会在 WriteToEventViewer 中引发权限异常。
猜你喜欢
  • 2020-01-01
  • 1970-01-01
  • 2020-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多