Windows 服务 运行 没有做任何事
Windows service running not doing anything
我的服务是 运行 但它不执行我在 OnStart 中插入的任何逻辑,
此外,我尝试将消息记录到事件查看器,但它甚至没有到达那部分(我假设它在 OnStart 之前下降..)
有人可以告诉我我做错了什么吗?谢谢,
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());
}
OnStart 逻辑
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;
}
写入事件查看器
private void WriteToEventViewer(string msg)
{
using (EventLog eventLog = new EventLog("DSGService"))
{
eventLog.Source = "DSGService";
eventLog.WriteEntry(msg, EventLogEntryType.Information, 101, 1);
}
}
}```
这可能是 TimerElapsed
方法内部发生异常导致计时器无法重新启动的结果。为避免这种情况,您可以执行以下操作:
将定时器的 AutoReset
属性 设置为 false
。
在 TimerElapsed
事件处理程序中,在 finally
子句中,再次启动计时器。
这意味着即使在您的 TimerElapsed
事件处理程序中发生异常,计时器也会重新启动。
我的服务是 运行 但它不执行我在 OnStart 中插入的任何逻辑, 此外,我尝试将消息记录到事件查看器,但它甚至没有到达那部分(我假设它在 OnStart 之前下降..) 有人可以告诉我我做错了什么吗?谢谢,
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());
}
OnStart 逻辑
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;
}
写入事件查看器
private void WriteToEventViewer(string msg)
{
using (EventLog eventLog = new EventLog("DSGService"))
{
eventLog.Source = "DSGService";
eventLog.WriteEntry(msg, EventLogEntryType.Information, 101, 1);
}
}
}```
这可能是 TimerElapsed
方法内部发生异常导致计时器无法重新启动的结果。为避免这种情况,您可以执行以下操作:
将定时器的
AutoReset
属性 设置为false
。在
TimerElapsed
事件处理程序中,在finally
子句中,再次启动计时器。
这意味着即使在您的 TimerElapsed
事件处理程序中发生异常,计时器也会重新启动。