繁体   English   中英

未命中System.Threading.Timer回调

[英]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是问题所在,这使我尝试了以下两件事:

  • 使用构造函数Timer(callback),因此它将提供对回调的自引用。 但是,这仍然不会阻止它超出范围,所以这是不可行的。
  • 将计时器定义为Manager类中的静态变量。 应该可以防止它被GC使用,但似乎并没有每24小时调用一次。

在这方面的任何帮助将不胜感激

最后,我使用了常规的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM