每隔一分钟运行一次Windows服务

时间:2014-08-25 02:57:45

标签: c# timer windows-services

我已经尝试每1分钟运行一次服务,但我已经成功完成了这项服务,但问题是它每分钟都会启动,无论程序是否完成。我这样写了

    private Timer _timer;
    private DateTime _lastRun = DateTime.Now.AddDays(-1);
    public SpotlessService()
    {
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
        _timer = new Timer(1 * 60 * 1000); // every 1 hour
        _timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
        _timer.Start();


    }

    public void Start()
    {
        OnStart(new string[0]);
    }
    void timer_Elapsed(object sender, EventArgs e)
    {
        Util.LogError("Started at" + DateTime.Now + "");

        FileDownload objdwn = new FileDownload();
    }

我已将其作为服务托管,FileDownload类构造函数将从服务器下载一些文件,并将数据复制到数据库中,这将需要10-15分钟。所以我需要做的是我应该停止计时器,直到这十五分钟,服务应该重新开始,应该等待下一分钟做同样的事情。这是可能的还是我应该更大程度地增加计时器值

2 个答案:

答案 0 :(得分:1)

在Elapse事件开始时停止()计时器,并在结束时启动()计时器。还要确保您的计时器对象不会被垃圾收集。

private Timer _timer;
private DateTime _lastRun = DateTime.Now.AddDays(-1);
public SpotlessService()
{
    InitializeComponent();
}

protected override void OnStart(string[] args)
{
    _timer = new Timer(1 * 60 * 1000); // every 1 minute
    _timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
    _timer.Start();


}

public void Start()
{
    OnStart(new string[0]);
}
void timer_Elapsed(object sender, EventArgs e)
{
    _timer.Stop();

    Util.LogError("Started at" + DateTime.Now + "");

    FileDownload objdwn = new FileDownload();

    _timer.Start()
}

答案 1 :(得分:1)

我的建议是使用Task执行下载,并在完成后再次调用main方法。

public void mainMethod() 
{
    Thread.Sleep(60000);
    doDownload();
}

public void doDownload() 
{
    Task.Factory.StartNew(() => {
        // Background download
    }).ContinueWith(task => mainMethod());
}

这将允许您在下载过程中根据需要在主线程中执行任何其他操作。

您可以停止计时器并在下载完成后再次运行

void timer_Elapsed(object sender, EventArgs e)
{
    _timer.Stop();
    Util.LogError("Started at" + DateTime.Now + "");

    FileDownload objdwn = new FileDownload();
    _timer.Start();
}