我在尝试编一个可以根据用户设置的参数,定时备份文件的小程序。主要代码如下:
namespace copydelmove
{
    public partial class mainform : Form
    {    
        System.Timers.Timer myTimer = new System.Timers.Timer();        ......        private void start_btn_Click(object sender, EventArgs e)//启动按钮
        {
            myTimer.Interval = 1000;
            myTimer.Enabled = true;
            myTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
        }
        
        private void OnTimedEvent(object source, ElapsedEventArgs e)
        {
            if(DateTime.Now == DateTime.Parse("2009/9/11 08:12:55"))
            {                
                backupatonce();//条件达到,立即备份,backupatonce的代码经过测试,可以实现备份操作。              
            }                    
        }
        ......
}但是在运行的时候,有时候可以运行,有时候不能运行。是不是timer不够精确造成的

解决方案 »

  1.   

    应该不是timer的问题。
    可能是需要备份的文件的问题。
      

  2.   

    但是在运行的时候,有时候可以运行,有时候不能运行。是不是timer不够精确造成的Timer不会出现问题.我在使用过程中还没有发现它在精确方面的问题.
      

  3.   

    只是提出一种可能的原因,在备份操作时一定涉及到I/O操作,你的Timer的时间间隔只是1秒,会不会,是第二次执行Timer的时候,前一次的备份过程还没完成导致的
      

  4.   

    问题应该在这里
    if(DateTime.Now == DateTime.Parse("2009/9/11 08:12:55"))
    这个条件判断中的DateTime.Now的精度大于"2009/9/11 08:12:55",实际中"2009/9/11 08:12:55"=="2009/9/11 08:12:55.000", 而DateTime.Now可能会是"2009/9/11 08:12:55.123"所以在timer触发事件的时候,这两个值并不相等。
    试试下面的处理,也就是把DateTime.Now的毫秒去掉
    DateTime tempDT = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"));
    然后用tempDT比较DateTime.Parse("2009/9/11 08:12:55")
      

  5.   

    将备份的方法写在 timer 的Click事件里面看看.
      

  6.   

    问题在于if(DateTime.Now == DateTime.Parse("2009/9/11 08:12:55"))
    不能保证程序运行正好达到这个时间点。较好的做法可以判断当天的备份有没有做,备份的文件名称可以用时间来确定,程序直接判断当天的备份文件存不存在就好了。
      

  7.   

    System.Timers.Timer我在使用的时候的确会出现时间长了就莫名其妙的挂掉了。
    你可以换用Threading.Timer
      

  8.   

    备份时长大于设定的timer间隔