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#