当前位置:编程学习 > C#/ASP.NET >>

C#控制台程序中,实现定时执行一段代码,在线等

在控制台程序中,我想实现每天在指定的时间内定时执行一段程序,一天只能执行一次,下面的代码设置了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# 控制台 多线程 --------------------编程问答-------------------- 初门级别的问题,刚接触C#不久,请教了 --------------------编程问答--------------------    各位路过的,看看吧! --------------------编程问答-------------------- 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);
 }  --------------------编程问答-------------------- 第一个Timer 来判断时间是否到点。然后启动第二个Timer
第二个Timer 的 InterVal 值是 24*60*60*1000 --------------------编程问答-------------------- 或者用递归来监控是否到时间启动Timer --------------------编程问答-------------------- 开启一个线程, 让线程等待就OK了 --------------------编程问答-------------------- 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("初始化完成!");
  }
} --------------------编程问答-------------------- 能写几行明确的代码吗  --------------------编程问答-------------------- 把 System.Threading.Thread.Sleep(1000 * 60 * 60 * 3);移到RunDateInit方法内部
好像还是不行,
qiaohuyue  大哥,能说的详细一些吗 --------------------编程问答-------------------- --------------------编程问答-------------------- 第一个Timer 来判断时间是否到点。然后启动第二个Timer
第二个Timer 的 InterVal 值是 24*60*60*1000    


怎么写代码 --------------------编程问答-------------------- 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("初始化完成!");
            }
         } --------------------编程问答-------------------- 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小时才能执行,当天就没法执行了,貌似还有些不对, 还有些什么样的改进呢  --------------------编程问答--------------------
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("初始化完成!");
        }
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,