[英]System.Threading.Timer callback not being hit
我有一个Windows服务,除其他外,它需要每24小时进行一些数据库维护。 (SQL Express,因此无法在数据库内部进行调度)
为此,我创建了一个带有回调数据库维护方法的计时器,但它似乎只被击中了一次(我认为在创建计时器后)。 我认为这是由于计时器本身超出范围并进行了GC处理,但是我尝试过的所有解决方案似乎都无法正常工作
服务的基本布局如下:
WindowsService.cs:
protected override void OnStart(string[] args)
{
ThreadPool.QueueUserWorkItem(StartServices);
}
private void StartServices() { Manager.Start(); }
Manager.cs:
public class Manager
{
private static Timer MaintenanceTimer;
public static void Start()
{
MaintenanceTimer = new Timer(DoMaintenance);
MaintenanceTimer.Change(new TimeSpan(0), new TimeSpan(24,0,0,0)); //I use 1 minute for testing
}
}
显然,此代码已被严格简化,但这几乎就是所发生的事情。 如前所述,我认为GC是问题所在,这使我尝试了以下两件事:
在这方面的任何帮助将不胜感激
最后,我使用了常规的System.Timers.Timer解决了我的问题。 不过,仍然不确定我System.Threading.Timer出了什么问题。
由于不能在SQL Server Express中使用SQL Server代理,因此最好的解决方案是创建SQL脚本,然后将其作为计划任务运行。
我可以轻松地进行验证和维护,您可以安排多个计划任务来适应您的备份计划/保留时间。
我在计划任务中使用的命令是:
C:\Program Files\Microsoft SQL Server\90\Tools\Binn\SQLCMD.EXE" -i"c:\path\to\sqlbackupScript.sql
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.