我的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;
}
答案 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
。否则你只是猜测什么是错的。