这是我写的第一个窗口服务,我需要一些帮助来编写它,我正在尝试使用单个线程,以便一个线程可以启动服务 另一个线程可以负责调用数据库工作的函数。我也在使用计时器,这样这项服务每天只运行一次,是我的代码
我发布此问题的原因是每当我尝试安装此服务时,都会抛出错误“致命错误”,它不会给我任何细节。
public partial class Service1 : ServiceBase
{
private DateTime _lastRun = DateTime.Now;
Thread workerThread;
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
ThreadStart st = new ThreadStart(WorkerFunction);
workerThread = new Thread(st);
serviceStarted = true;
workerThread.Start();
}
protected override void OnStop()
{
// flag to tell the worker process to stop
serviceStarted = false;
// give it a little time to finish any pending work
workerThread.Join(new TimeSpan(0, 2, 0));
timer1.Enabled = false;
}
private void WorkerFunction()
{
while (serviceStarted)
{
EventLog.WriteEntry("Service working",
System.Diagnostics.EventLogEntryType.Information);
// yield
if (serviceStarted)
{
Thread.Sleep(new TimeSpan(0, 20000, 0));
}
timer1.Enabled = true;
timer1.Start();
}
// time to end the thread
Thread.CurrentThread.Abort();
}
private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
if (_lastRun.Date < DateTime.Now.Date)
{
timer1.Stop();
// does the actual work that deals with the database
}
timer1.Start();
}
答案 0 :(得分:0)
有几件事需要检查:
EventLog
来源(MSDN)。我对Windows service Started and stopped automatically, exception handling issue的回答在这里也很有用。System.Threading
命名空间(MSDN)中的Timer类进行调查。特别是,您可能会发现使用System.Threading.Timer
将大大简化您的代码,因为此对象将为您管理更多的管道。
我还建议不要打电话给Thread.Abort()
:它可能是有害的,也是不可预测的,而在你的情况下,你似乎根本不需要使用它。见To CurrentThread.Abort or not to CurrentThread.Abort和
http://msdn.microsoft.com/en-us/library/5b50fdsz.aspx。