要做一个程序,每分钟,每小时,每天各自触发一个方法。
  用三个TIMER控件,但试验了好几天,发现没有效果。
 请问大神,谁知道怎么解决。
  如果只能用一个TIMER怎么判断当前时间为整点整分时间 ?
比如整点时间18:00:00
比如整分时间17:58:00该怎么判断这个时间,还望有个实际的代码演示一下,万分感激。
VS2008,.net的,C#

解决方案 »

  1.   

    有个很笨的方法啊比如整点时间18:00:00
    比如整分时间17:58:00datetime.now.minute == 0 && datetime.now.second == 0    //整点时间
    datetime.now.second == 0  //整分随手打的,自己改一下
      

  2.   

    我上面举得例子只是针对你的比如整点时间18:00:00
    比如整分时间17:58:00
    这两个描述而言的。你说的“每小时、每天”其实还是“每分钟”的概念,是要在每分钟里边去判断是否出发事件。所以要判断“每小时”,必须而且只要做好判断“每分钟”。另外所谓的“每分钟”精度是什么呢?是误差不要超过1分钟,还是1秒钟?如果要求是“秒”级的,那么就不仅仅要在判断时简单地忽略秒(对于毫秒也是如此),而且你要先插入一个小的定时调整操作。例如启动时的是时间是 17点28分39秒431毫秒,那么你就应该先让定时器的 Interval 为 20秒569毫秒,然后等17点29分的时候再开始1分钟一次定时。这样才能比较接近“每分钟”的要求。
      

  3.   

    如果不刻意要求精度的话,你可以做一个时间跨度为5秒的计数器,用以判断当前时间是否在指定的时间段范围内。比如当前时间落在整数分钟的前后4秒范围内,就执行每分钟要执行的方法。这样计数器必然有一个且只有一个Tick会落在这个时间范围内。
    依此类推。这样用一个计时器可以满足三种(分钟、小时、天)的定时要求。而不用三个计数器。
      

  4.   

    程序要实现的效果是这样的。
    还是说一下吧,不然好多东扯西扯的。。
    一个TIMER执行每分钟将标记为每分钟的数据进行上传
    一个。。每小时
    一个。。每天
    每分钟就是比如03:01:00 或者 03:02:00
    每小时就是比如04:00:00 或者 05:00:00
    每天就是00:00:00
    现在3个TIMER在一个页面上摆放着,我看过这个SP1234说过这个给别人,说什么TIMER会回传啥的,所以我想执行每分钟的会在每分钟刷新这个页面,导致每小时每天被重新计时,导致只有分钟有效果,其他都没有效果。
    然后我就来问啊,如何让三个TIMER各行其职,分开统计自己的计数?
    如果这样行不通,那么只能用一个TIMER的话,那自然是每秒获得当天时间,再经过一系列判断,来实现三个TIMER的效果。
    但是呢,我有小试验一下,每秒在文本框里显示当前时间,发现很大一部分,是会从比如03:01:59直接跳到03:02:01这样子的,所以我就怀疑自己啦。
    最好是有能三个TIMER各行其职的方法
    望各位大神不吝赐教 !~
      

  5.   

    你好,我没有必要这么精确,你钻牛角尖了,或者进入咬文嚼字的阶段了。
    我也不可能那么精确的知道部署到服务器的具体时间是多少,自然肯定也无法在0点0分0秒0毫秒把程序在服务器上启动起来。
    我只需要在每个分钟内的任意一秒执行一个每分钟任务即可,然后接着是下一个分钟。
    当然,主要问题在我,表达的不够细致。
    但我觉得,我想问的问题,只是在TIMER控件上,如果三个同时用而不被回传刷新给重置了另外两个。
    这才是我得主要问题,我看过你有回答过别人的这方面的问题。
    是否把TIMER控件放在UPDATEPANL(拼写可能有误)里就可以了 ?
    每个TIMER放在一个UPDATEPANL里 ?
    谢谢 !~~
      

  6.   

    求大家不要旁生枝节了,不要讨论这个精确时间的问题,我只想知道如何让三个TIMER控件在一起分别执行。
    仅此而已。
    实在不行,我是有后备办法了,但可以的,不太用后备方法,谢谢大家了。
      

  7.   

    你怎么奇葩到想利用网页上的定时器来实现服务器上的定时逻辑。难道把这个网页一直开着?
    这东西显然是要用windows后台服务来实现的。楼上的大神估计都没有考虑到你这么奇怪的想法。他们先入为主认为你是在做一个windows的后台程序。
      

  8.   


    因为不会做WINFORM程序,太少接触这个,这几年来一直都在用SQLSERVER,本来想再SQLSERVER里直接做这些上传工作的,因为SQL语法比C#用的好,结果卡在数据库字符集上面,没办法了,只好用C#来做定时上传,SQL来做上传控制。
    SQL的自动计划太简单好用,上传程序不好做,但卡在字符集上,C#上传程序好做,但卡在自动计划上。
    愁呀,就快变沙皮狗了
      

  9.   

    看来没人知道,只好用备用方法了。
    只留一个TIMER,60000毫秒一次间隔
    创建两个静态变量,shi,fen
        private static int fen = 0;
        private static int shi = 0;
    创建方法
    private static void compleTimerWork()
        {
            
            if (fen % 2 == 0)
            {
                checkDataWork();
            }
            if (fen == 60)
            {
                shi += 1;
                allImport("每小时");
                fen = 0;
            }
            else
            {
                fen += 1;
                allImport("每分钟");
            }
            if (shi == 24)
            {
                allImport("每天");
                shi = 0;
            }
        }
      

  10.   

    先学一下服务吧:
    http://blog.csdn.net/yenange/article/details/8288328
    用网站不是太靠谱。同时用3个Timer为什么不可以?
    关键是你的逻辑要清楚
      

  11.   

    Windows计划任务
    SQL Server Job
    Windows Service
      

  12.   

    定时执行的话,用window  service 做个服务吧,给你个例子片断:
     protected override void OnStart(string[] args)
            {
                EventLog.WriteEntry("某某服务开始启动");
                pf.WriteLog("服务启动");            System.Timers.Timer t = new System.Timers.Timer();
                t.Interval = 5000;//每5分钟调用一次方法
                t.Elapsed += new ElapsedEventHandler(ChkSvr);
                t.AutoReset = true;//是执行一次(false),还是一直执行(true)
                t.Enabled = true;//是否引发ElapsedEventHandler事件。
            }        public void ChkSvr(object source,ElapsedEventArgs e)
            {
                int intHour = e.SignalTime.Hour;
                int intMinute = e.SignalTime.Minute;
                int intSecond = e.SignalTime.Second;            if (intHour == 15 && intMinute == 0 && intSecond < 5 )
                {
                    System.Timers.Timer tt = (System.Timers.Timer)source;
                    tt.Enabled = false;
                    try
                    {                   执行定时方法
                    }
                    catch(Exception exp)
                    {
                        pf.WriteLog("执行出现错误,错误信息:"+exp.Message+",详细错误:"+exp.StackTrace.ToString());
                    }
                    finally
                    {
                        tt.Enabled = true;
                    }
                }        }以上一个定时是每天定点执行一次,我这个例子时间点控制并不精确,你可以改成你需要的。可以放多个Timer的,各自实现自已的定时需求。