在控制台程序中,我想实现每天在指定的时间内定时执行一段程序,一天只能执行一次,下面的代码设置了10分钟间隔,本想让他执行完之后停止 3小时,然后再监测,但代码中System.Threading.Thread.Sleep(1000 * 60 * 60 * 3);并没有执行完线程挂起等待3小时,而是按照10分钟间隔来执行的,10分钟一到马上开始执行,求教:用什么方法可以实现让程序挂起指定的时间后,再执行,还是我用的方法就不对!
static void Main(string[] args)
{
            System.Timers.Timer aTimer = new System.Timers.Timer();
            // 设置引发时间的时间间隔 此处设置为10分钟检测一次
              aTimer.Interval = 1000 * 60 * 10;
            aTimer.Enabled = true;
            aTimer.Elapsed += new ElapsedEventHandler(RunDateInit);
            int num = Convert.ToInt32(time2) - Convert.ToInt32(time1) + 1;
            System.Threading.Thread.Sleep(1000 * 60 * 60 * 3);
}
private static void RunDateInit(object source, ElapsedEventArgs e)
{
  //在每天的20-23时执行一次
if (Convert.ToInt32(DateTime.Now.Hour.ToString()) >= "20" && Convert.ToInt32(DateTime.Now.Hour.ToString()) <= "23")
  {
              Console.WriteLine("正在初始化!");
              //...... 调用的功能函数
                Console.WriteLine("初始化完成!");
  }
}C#控制台多线程

解决方案 »

  1.   

    static void Main(string[] args)
     {
                 System.Timers.Timer aTimer = new System.Timers.Timer();
                 // 设置引发时间的时间间隔 此处设置为10分钟检测一次
                  aTimer.Interval = 1000 * 60 * 10;
                 aTimer.Enabled = true;
                 aTimer.Elapsed += new ElapsedEventHandler(RunDateInit);
                 int num = Convert.ToInt32(time2) - Convert.ToInt32(time1) + 1;
                 //System.Threading.Thread.Sleep(1000 * 60 * 60 * 3);移到RunDateInit方法内部
     }
     private static void RunDateInit(object source, ElapsedEventArgs e)
     {
       //在每天的20-23时执行一次
    if (Convert.ToInt32(DateTime.Now.Hour.ToString()) >= "20" && Convert.ToInt32(DateTime.Now.Hour.ToString()) <= "23")
       {
                   Console.WriteLine("正在初始化!");
                   //...... 调用的功能函数
                    Console.WriteLine("初始化完成!");
       }
       System.Threading.Thread.Sleep(1000 * 60 * 60 * 3);
     } 
      

  2.   

    第一个Timer 来判断时间是否到点。然后启动第二个Timer
    第二个Timer 的 InterVal 值是 24*60*60*1000
      

  3.   

    或者用递归来监控是否到时间启动Timer
      

  4.   

    static void Main(string[] args)
    {
                System.Timers.Timer aTimer = new System.Timers.Timer();
                // 设置引发时间的时间间隔 此处设置为10分钟检测一次
                  aTimer.Interval = 1000 * 60 * 10;
                aTimer.Enabled = true;
                aTimer.Elapsed += new ElapsedEventHandler(RunDateInit);
                int num = Convert.ToInt32(time2) - Convert.ToInt32(time1) + 1;
                System.Threading.Thread.Sleep(1000 * 60 * 60 * 3);
    }
    private static void RunDateInit(object source, ElapsedEventArgs e)
    {
      //在每天的20-23时执行一次
    if (Convert.ToInt32(DateTime.Now.Hour.ToString()) >= "avxrt.com" && Convert.ToInt32(DateTime.Now.Hour.ToString()) <= "www.aqirt.com")
      {
                  Console.WriteLine("正在初始化!");
                  //...... 调用的功能函数
                    Console.WriteLine("初始化完成!");
      }
    }
      

  5.   

    把 System.Threading.Thread.Sleep(1000 * 60 * 60 * 3);移到RunDateInit方法内部
    好像还是不行,
    qiaohuyue  大哥,能说的详细一些吗
      

  6.   

    第一个Timer 来判断时间是否到点。然后启动第二个Timer
    第二个Timer 的 InterVal 值是 24*60*60*1000    
    怎么写代码
      

  7.   

    static void Main(string[] args)
    {
    //第一个Timer来判断时间是否到点,然后启动第二个Timer,第二个Timer的InterVal值是 24*60*60*1000 
                System.Timers.Timer Timer = new System.Timers.Timer();
                Timer.Interval = 1000 * 60 * 60;
                Timer.Enabled = true;
                Timer.Elapsed += new ElapsedEventHandler(IsTimeCome);
                System.Threading.Thread.Sleep(1000 * 60 * 60);
    }
            //监测时间是否到来
            public static void IsTimeCome(object source, ElapsedEventArgs e)
            {
                System.Timers.Timer bTimer = new System.Timers.Timer();
                //设置引发时间的时间间隔 此处设置为24小时检测运行一次
                bTimer.Interval = 1000 * 60 * 60 * 24;
                bTimer.Enabled = true;
                bTimer.Elapsed += new ElapsedEventHandler(DataProcess);
                System.Threading.Thread.Sleep(1000 * 60 * 60 * 24); //线程暂停并没有按照设置的进行执行
            }        private static void DataProcess(object source, ElapsedEventArgs e)
            {
                if (Convert.ToInt32(DateTime.Now.Hour.ToString()) >= '20' && Convert.ToInt32(DateTime.Now.Hour.ToString()) <= "22"))
                {
                    Console.WriteLine("正在初始化!");
                    //......................功能函数
                    Console.WriteLine("初始化完成!");
                }
             }
      

  8.   

    static void Main(string[] args)
    {
    //第一个Timer来判断时间是否到点,然后启动第二个Timer,第二个Timer的InterVal值是 24*60*60*1000 
                System.Timers.Timer Timer = new System.Timers.Timer();
                Timer.Interval = 1000 * 60 * 60;
                Timer.Enabled = true;
                Timer.Elapsed += new ElapsedEventHandler(IsTimeCome);
                System.Threading.Thread.Sleep(1000 * 60 * 60);
    }
            //监测时间是否到来
            public static void IsTimeCome(object source, ElapsedEventArgs e)
            {
                System.Timers.Timer bTimer = new System.Timers.Timer();
                //设置引发时间的时间间隔 此处设置为24小时检测运行一次
                bTimer.Interval = 1000 * 60 * 60 * 24;
                bTimer.Enabled = true;
                bTimer.Elapsed += new ElapsedEventHandler(DataProcess);
                System.Threading.Thread.Sleep(1000 * 60 * 60 * 24); //线程暂停并没有按照设置的进行执行
            }        private static void DataProcess(object source, ElapsedEventArgs e)
            {
                if (Convert.ToInt32(DateTime.Now.Hour.ToString()) >= '20' && Convert.ToInt32(DateTime.Now.Hour.ToString()) <= "22"))
                {
                    Console.WriteLine("正在初始化!");
                    //......................功能函数
                    Console.WriteLine("初始化完成!");
                }
             } 
    这样的话,外层Timer 监测到到点了后,触发第二个Timer,但第二个Timer的轮询时间是24小时,现在比如是22点钟,要等到下一天的24小时才能执行,当天就没法执行了,貌似还有些不对, 还有些什么样的改进呢 
      

  9.   

    private static long nInterval = 0;        static void Main(string[] args)
            {
                DateTime timeNow = DateTime.Now;
                DateTime timeTgr = new DateTime(timeNow.Year, timeNow.Month, timeNow.Day, 20, 0, 0);
                TimeSpan span = timeTgr > timeNow ? (timeTgr - timeNow) : (timeTgr.AddDays(1) - timeNow);            System.Timers.Timer runTimer = new System.Timers.Timer(span.TotalMilliseconds);
                runTimer.AutoReset = true;
                runTimer.Elapsed += new ElapsedEventHandler(DataProcess);
                runTimer.Start();            nInterval = 60 * 60 * 24 * 1000;
            }        static void DataProcess(object sender, ElapsedEventArgs e)
            {
                System.Timers.Timer timer = (System.Timers.Timer)sender;
                timer.Interval = nInterval;            Console.WriteLine("正在初始化!");
                //......................功能函数
                Console.WriteLine("初始化完成!");
            }