-2

我的 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;
}
4

3 回答 3

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.
     }
}

因此,您的计时器正在工作,但您在其中做错了什么。

于 2013-09-12T19:15:39.870 回答
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。

于 2013-09-12T18:27:10.090 回答
0

也许您getFileListc:\windows\system32\.

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

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

于 2013-09-12T21:27:02.050 回答