如何在c#

时间:2015-07-08 21:48:04

标签: c# multithreading windows-services

我想创建一个执行一些非常繁重的工作的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以进行某些数据处理?

1 个答案:

答案 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();
}