【发布时间】:2014-07-02 12:07:53
【问题描述】:
我目前正在开发 Windows 服务作为我们应用程序的非 GUI 部分。
我编写了一个服务,它在调试条件下完美运行。这意味着我通过如下方式调试我的静态 void Main():
#if(!DEBUG)
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new TRAservice()
};
ServiceBase.Run(ServicesToRun);
#else
TRAservice Service = new TRAservice();
Service.CanHandlePowerEvent = false;
Service.CanHandleSessionChangeEvent = false;
Service.CanPauseAndContinue = true;
Service.CanShutdown = true;
Service.CanStop = true;
Service.ServiceName = "TRAservice";
Service.AutoLog = false;
Service.SetMethod();
Service.TRAmethod();
#endif
为了进行一些实施测试,我添加了一个 ProjectInstaller,并通过 VStools cmd 提示符 installutil servicename.exe 安装我的服务。 (作为参考,我在这篇文章的底部包含了带有 OnStart 的服务的构造函数。)
但是,当我尝试启动服务时,我收到以下错误:
在我的事件查看器中,我收到 4 条消息(2 条信息(Windows 错误报告),2 条错误):
我尝试了很多东西,包括但不限于从构造函数中删除调试行(如其他地方所建议的那样)、重新启动、从 Release 安装(而不是 Debug)...
我会接受任何建议来解决这个问题。提前致谢。
public TRAservice()
{
InitializeComponent();
CanHandlePowerEvent = false;
CanHandleSessionChangeEvent = false;
CanPauseAndContinue = true;
CanShutdown = true;
CanStop = true;
ServiceName = "TRAservice";
AutoLog = false;
sSource = "TRAservice";
sLog = "TRAlog";
if (!EventLog.SourceExists(sSource))
{
EventLog.CreateEventSource(sSource, sLog);
}
eventLog1 = new System.Diagnostics.EventLog();
eventLog1.Source = sSource;
eventLog1.Log = sLog;
eventLog1.WriteEntry("Service started", EventLogEntryType.Information, 1, 100);
scheduleTimer = new Timer();
scheduleTimer.Interval = 10;
scheduleTimer.Elapsed += new ElapsedEventHandler(scheduleTimer_Elapsed);;
}
protected override void OnStart(string[] args)
{
eventLog1.WriteEntry("Service started", EventLogEntryType.Information, 1, 100);
flag = true;
sw = true;
lastRun = DateTime.Now;
scheduleTimer.Start();
}
【问题讨论】:
-
创建事件源应该在您的安装程序类中完成,而不是在您的服务类的构造函数中 - 服务将被 安装 并具有管理员权限,但它可能并不总是 在管理员权限下运行。
-
谢谢。当我实施您的建议时,我在安装服务时收到以下错误:安装阶段发生异常。
System.ArgumentException: Source TRAservice already exists on the local computer.但是我将其从寄存器中删除,此错误不断弹出。有什么建议吗?
标签: c# .net service windows-services