C# 每一分钟运行一次windows服务

C# 每一分钟运行一次windows服务,c#,timer,windows-services,C#,Timer,Windows Services,我曾尝试每1分钟运行一次服务,并成功地做到了这一点,但问题是无论程序是否完成,它都会每分钟启动一次。我是这样写的 private Timer _timer; private DateTime _lastRun = DateTime.Now.AddDays(-1); public SpotlessService() { InitializeComponent(); } protected override void OnStart(

我曾尝试每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分钟。因此,我需要做的是,我应该停止计时器,直到这15分钟,服务应该再次启动,应该等待下一分钟,并做同样的事情。这是可能的,还是我应该更大程度地增加计时器值

在消逝事件开始时停止()计时器,在结束时启动()计时器。还要确保计时器对象不会被垃圾回收

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()
}

我的建议是使用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();
}

我怎么能确定_定时器不会被垃圾收集器处理?我能相信这个密码吗?至少,我该如何测试它?非常感谢。