我想创建一个执行一些非常繁重的工作的Windows服务。代码在OnStart方法中,如下所示:
protected override void OnStart(string[] args)
{
System.IO.File.WriteAllText(
@"C:\MMS\Logs\WinServiceLogs.txt",
DateTime.Now + "\t MMS Service started."
);
this.RequestAdditionalTime(5*60*1000);
this.RunService();
}
this.RunService()
向IIS上托管的WCF服务库发送请求。它执行一些非常长的过程,范围从1-20分钟,具体取决于它必须处理的数据。我写的这项服务应该安排在每天早上运行。到目前为止,它运行良好,但是当时间超过几秒或几分钟时,它会生成超时异常。这会导致Windows服务处于不稳定状态,我无法在不重新启动计算机的情况下停止或卸载它。因为,我试图创建一个自动化系统,这是一个问题。
我确实做过this.RequestAdditionalTime()
,但我不确定它是否做了它应该做或不做的事。我没有收到超时错误消息,但现在我不知道如何安排它以便它每天运行。如果发生异常,则下次不会运行。我找到了几篇文章,但有些东西我不知道,我无法理解。
我应该创建一个帖子吗?有些文章说我不应该在OnStart上放置重型程序,那么我应该把重型代码放在哪里呢?现在,当服务启动时,它执行这种巨大的数据处理,使Windows服务状态为" Starting",并且它会在那里停留很长时间,直到程序因超时而崩溃或成功完成。如何启动服务,然后在代码运行时将状态设置为Running
以进行某些数据处理?
答案 0 :(得分:1)
劳埃德在上述评论中说,你的情况可能更适合预定的任务。但是,如果您真的想使用Windows服务,那么您需要在服务代码中添加/更新。这将允许您的服务列为已启动而不是超时。您可以根据需要调整计时器长度。
private Timer processingTimer;
public YourService()
{
InitializeComponent();
//Initialize timer
processingTimer = new Timer(60000); //Set to run every 60 seconds
processingTimer.Elapsed += processingTimer_Elapsed;
processingTimer.AutoReset = true;
processingTimer.Enabled = true;
}
private void processingTimer_Elapsed(object sender, ElapsedEventArgs e)
{
//Check the time
if (timeCheck && haventRunToday)
//Run your code
//You should probably still run this as a separate thread
this.RunService();
}
protected override void OnStart(string[] args)
{
//Start the timer
processingTimer.Start();
}
protected override void OnStop()
{
//Check to make sure that your code isn't still running... (if separate thread)
//Stop the timer
processingTimer.Stop();
}
protected override void OnPause()
{
//Stop the timer
processingTimer.Stop();
}
protected override void OnContinue()
{
//Start the timer
processingTimer.Start();
}