Windows 服务因超时而失败
Windows Service Failing Due to Timeout
我在 C# 中创建了一个 Windows 服务,安装正常,但是当我尝试 运行 它时,我得到一个 'Error 1053: The service did not respond to the start or control request in a timely fashion.'。我是 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
方法 return 收到该消息。
解决方案是将所有计算密集型工作转移到不同的线程上。
...当然,您已经在这样做了。伟大的。但是你也在你的构造函数中工作,这要么花费太长时间,要么甚至可能失败。因此,从构造函数中提取该工作并将其也放入您的后台线程中。
我遇到过类似的问题。我的经验是在重启时启动服务。我有两个服务试图使用相同的资源同时启动。一个会失败,另一个会启动。
在服务的设置选项上,我将其设置为在失败的服务上延迟启动。重新启动后,系统正常工作,并且两项服务 运行.
我在 C# 中创建了一个 Windows 服务,安装正常,但是当我尝试 运行 它时,我得到一个 'Error 1053: The service did not respond to the start or control request in a timely fashion.'。我是 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
方法 return 收到该消息。
解决方案是将所有计算密集型工作转移到不同的线程上。
...当然,您已经在这样做了。伟大的。但是你也在你的构造函数中工作,这要么花费太长时间,要么甚至可能失败。因此,从构造函数中提取该工作并将其也放入您的后台线程中。
我遇到过类似的问题。我的经验是在重启时启动服务。我有两个服务试图使用相同的资源同时启动。一个会失败,另一个会启动。
在服务的设置选项上,我将其设置为在失败的服务上延迟启动。重新启动后,系统正常工作,并且两项服务 运行.