我已经尝试每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分钟。所以我需要做的是我应该停止计时器,直到这十五分钟,服务应该重新开始,应该等待下一分钟做同样的事情。这是可能的还是我应该更大程度地增加计时器值
答案 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();
}