Windows服务中的计时器错误

时间:2013-09-12 18:16:23

标签: c# timer windows-services

我的Windows服务中有计时器,但Windows服务没有做它应该做的事情。 我想问你,如果我有好的代码和计时器?

我的部分代码(已更新):

protected override void OnStart(string[] args)
{
    timer = new System.Timers.Timer();
    timer.Elapsed += new ElapsedEventHandler(getFileList);
    timer.Interval = 10000;
    timer.Enabled = true;
    timer.AutoReset = false;
}

private void getFileList(object sender, EventArgs e)
{
    //Work with xml...                
    DeleteOldBackupFiles();
}

private void DeleteOldBackupFiles()
{
    string[] Oldfiles = Directory.GetFiles(backup);
    foreach (string Ofile in Oldfiles)
    {
        FileInfo fi = new FileInfo(Ofile);
        if (fi.LastWriteTime < DateTime.Now.AddMonths(-2))
        {
            fi.Delete();
        }
    }
}

在你的想法之后我编辑我的代码,但结果是一样的..

protected override void OnStart(string[] args)
{
    timer = new System.Timers.Timer();
    timer.Elapsed += new ElapsedEventHandler(getFileList);
    timer.Interval = 10000;
    timer.Enabled = true;
    timer.AutoReset = true;
}

3 个答案:

答案 0 :(得分:2)

你的计时器中很可能出现错误,导致它抛出异常。您将无法检测到,因为System.Timers.Timer会默默地忽略所有未处理的异常。

因此,您必须使用try / catch块包装所有代码:

private void getFileList(object sender, EventArgs e)
{
     try
     {
         DeleteOldBackupFiles();
     }
     catch (Exception ex)
     {
         //log exception or just put a breakpoint here.
     }
}

因此你的计时器正在运行,但你在做错了。

答案 1 :(得分:1)

我会改为:

protected override void OnStart(string[] args)
        {
            timer = new System.Timers.Timer();
            timer.Elapsed += new ElapsedEventHandler(getFileList);
            timer.Interval = 10000;
            timer.AutoReset = false;
            timer.Enabled = true;
        }
 private void getFileList(object sender, EventArgs e)
        {
            List<string> files = new List<string>();
            try
            {
                FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(****);

AutoReset设置为false会导致Timer仅触发一次。换句话说,它就像在第一次触发定时器后自动停止。这样做意味着您不需要在getFileList方法中停止()Timer。当Timer间隔很小时,这是一个重要的区别。如果将AutoReset设置为true并在处理程序的顶部调用Stop(),则很可能会多次调用您的方法。将AutoReset设置为false是获得所需行为的更明确的方式。

调用Start()并将Enabled设置为true是多余的,因此我删除了Start()。

间隔是毫秒,所以我将其更改为10000。

答案 2 :(得分:0)

也许您在getFileList中某处抛出了异常,可能是因为该服务的当前目录为c:\windows\system32\

添加对System.Windows.Forms的引用,然后在创建服务之前在Environment.CurrentDirectory = System.Windows.Forms.Application.StartupPath;中添加void Main(...)

正如@jgauffin指出的那样,你应该将你的getFileList主体包裹在'try catch'中,并将错误记录到某个绝对路径,如c:\errors.txt。否则你只是猜测什么是错的。