C# Windows服务因超时而失败

C# Windows服务因超时而失败,c#,windows-services,timeout,C#,Windows Services,Timeout,我已经用C#创建了一个安装良好的Windows服务,但是当我尝试运行它时,我得到了一个“错误1053:该服务没有及时响应启动或控制请求”。我不熟悉windows服务,不确定为什么会发生这种情况。服务代码如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Linq; usin

我已经用C#创建了一个安装良好的Windows服务,但是当我尝试运行它时,我得到了一个“错误1053:该服务没有及时响应启动或控制请求”。我不熟悉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-*");
        }
    }
}

不需要代码转储

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

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


。。。当然,你已经这么做了。伟大的但您也在构造函数中进行工作,这可能会花费太长时间,甚至可能会失败。因此,将该工作从构造函数中取出,并将其放在后台线程中。

我遇到了类似的问题。我的经验是在重新启动服务时启动服务。我有两个服务试图使用相同的资源同时启动。一个会失败,另一个会开始


在服务的设置选项中,我将其设置为故障服务的延迟启动。重新启动后,系统工作,两个服务都运行。

因此,根据我上面的代码,在另一个线程中不应该有什么?嗯,600亿cpu周期并不是很短的时间。好吧,balls,你已经在做了。从构造函数中提取代码,看看它是否启动得更快。@这会使它足够快。用一个小的解释作为答案发布,我会接受。如果你在构造函数中抛出一个异常会发生什么?它是否以同样的方式失败?这是一个手动启动的服务。所有其他服务应该已经在运行,而不是同时启动。我想这意味着我不会有你说的问题。我的假设正确吗?