Windows服务由于超时而失败

时间:2015-01-16 20:10:17

标签: c# windows-services timeout

我已经在C#中创建了一个安装良好的Windows服务,但是当我尝试运行它时,我得到一个错误1053:该服务没有及时响应启动或控制请求。&#39 ;.我是Windows服务的新手,并且不确定为什么会这样。以下代码为服务:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;
using System.Messaging;
using System.Threading;

namespace DataStream
{
    public partial class DataStreamService : ServiceBase
    {
        private EventLog logger;

        public DataStreamService()
        {
            this.AutoLog = false;
            if (!System.Diagnostics.EventLog.SourceExists("DataStream"))
            {
                EventLog.CreateEventSource("DataStream", "DataStreamLog");
            }
            logger = new EventLog();
            logger.Source = "DataStream";
        }

        protected override void OnStart(string[] args)
        {
            logger.WriteEntry("*-Service Started-*");
            Thread workThread = new Thread(this.moveTheQueue);
            workThread.Start();

        }

        private void moveTheQueue(object data)
        {
            logger.WriteEntry("*-Connecting to Queue-*");
            if (MessageQueue.Exists(@"./Private/testqueue"))
            {
                MessageQueue queue = new MessageQueue(@"./Private/testqueue");
                MessageEnumerator enumerator = queue.GetMessageEnumerator2();
                Message msg;

                while (enumerator.MoveNext(new TimeSpan(0, 0, 20)))
                {
                    try
                    {
                        msg = queue.PeekById(enumerator.Current.Id);
                        System.IO.File.WriteAllText(@"C:\Users\Public\MSMQTest\" + msg.Label + enumerator.Current.Id + "_" + DateTime.Now.ToString() + ".xml", msg.Body.ToString());
                        queue.ReceiveById(enumerator.Current.Id);
                        logger.WriteEntry("*-Received Message with Id " + msg.Id + " and Label " + msg.Label);
                    }
                    catch (Exception e)
                    {
                        logger.WriteEntry("*-ERROR: Failed to Obtain Message with Id " + enumerator.Current.Id);
                    }
                }
            }
            else
            {
                logger.WriteEntry("*-ERROR: No queue found. Check user credentials.-*");
            }
            Stop();
        }

        protected override void OnStop()
        {
            EventLog.WriteEntry("*-Service Stopped-*");
        }
    }
}

2 个答案:

答案 0 :(得分:2)

无需代码转储。

当系统启动服务时,在收到该消息之前,它们只有很短的时间从OnStart方法返回。

解决方案是将所有计算密集型工作转移到不同的线程上。

......当然,你已经这样做了。大。但是你也在你的构造函数中工作,这需要花费太长时间,甚至可能会失败。因此,将该工作从构造函数中拉出来并将其放在后台线程中。

答案 1 :(得分:0)

我遇到过类似的问题。我对此的体验是在重启时启动服务期间。我有两个服务尝试使用相同的资源同时启动。一个会失败而另一个会开始。

在服务的设置选项中,我将其设置为在发生故障的服务上延迟启动。重启后,系统运行正常,两个服务都已运行。