在控制台程序中,我想实现每天在指定的时间内定时执行一段程序,一天只能执行一次,下面的代码设置了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#控制台多线程
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#控制台多线程
{
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 的 InterVal 值是 24*60*60*1000
{
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("初始化完成!");
}
}
好像还是不行,
qiaohuyue 大哥,能说的详细一些吗
第二个Timer 的 InterVal 值是 24*60*60*1000
怎么写代码
{
//第一个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的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小时才能执行,当天就没法执行了,貌似还有些不对, 还有些什么样的改进呢
{
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("初始化完成!");
}