C# 正在运行的Windows服务没有执行任何操作
我的服务正在运行,但它不执行我在OnStart中插入的任何逻辑, 此外,我尝试将消息记录到eventviewer,但它甚至没有记录到该部分(我假设这是在OnStart之前发生的…) 有人能告诉我我做错了什么吗?谢谢C# 正在运行的Windows服务没有执行任何操作,c#,.net,windows-services,C#,.net,Windows Services,我的服务正在运行,但它不执行我在OnStart中插入的任何逻辑, 此外,我尝试将消息记录到eventviewer,但它甚至没有记录到该部分(我假设这是在OnStart之前发生的…) 有人能告诉我我做错了什么吗?谢谢 public partial class DSGService : ServiceBase { private static string ftpPath = ConfigurationManager.AppSettings["FtpPath"];
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());
}
启动逻辑
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;
}
写入eventviewer
private void WriteToEventViewer(string msg)
{
using (EventLog eventLog = new EventLog("DSGService"))
{
eventLog.Source = "DSGService";
eventLog.WriteEntry(msg, EventLogEntryType.Information, 101, 1);
}
}
}```
这可能是
timerecursed
方法内部的异常导致的,该异常会阻止计时器重新启动。为了避免这种情况,以下是您要做的:
AutoReset
属性设置为false
timerecursed
事件处理程序中的finally
子句中,再次启动计时器这意味着,即使在
timerecursed
事件处理程序中发生异常,计时器也会再次启动。这是否回答了您的问题?由于所有操作都已完成,因此需要设置bool并调用WriteToEventViewer
,我的赌注是WriteToEventViewer
方法,该方法在try块之前调用。因此,OP可能还希望加强该方法本身。System.Diagnostics.EventLog需要提升权限(请参阅),因此它可能会在WriteToEventViewer中引发权限异常。