关于多线程的有关问题!求帮助!
关于多线程的问题!求帮助!!!!
要求是要开三个线程,三个线程分别做不同的任务,其中两个线程每小时检查一次数据库,另一个线程是每天固定时间检查一次,对线程不熟,谁了解的帮我一下,谢谢
------解决思路----------------------
------解决思路----------------------
如果非得用线程 就这样吧..
------解决思路----------------------
1、线程递归循环中不能直接执行数据库等操作,防止阻塞使用新的线程或异步委托都可以。
2、手动创建线程,要把线程设置为后台线程。
3、最好做个保存记录,另一个问题出现操作失败时有没有其他解决方案。
Thread.Sleep(24 * 60 * 60000); 这个方法并不是很好,你不能保证程序中途不重启。
两个线程每个小时检查一次数据库,可以使用一个线程搞定。
第一次启动程序时,保存2个DateTime值,第2个time值+几分钟。
分别判断TimeSpan,大于等于60分钟时执行一次,并且重新保存DateTime值。
------解决思路----------------------
代码太多,没有多少时间看。随便说几点。
如果你是一个Console程序,那么在Main中必须阻塞,不能让住进程结束。例如写
(使用系统线程池)启动一个线程,只需要写
绝不要胡乱递归!要改为循环结构。
尽量不要写 Sleep(...) 阻塞代码。如果需要定时,应该使用系统定时器。系统定时器不需要什么线程阻塞,它是系统的硬件中断事件驱动的。
------解决思路----------------------
mh = new ManualResetEvent(false); // mh 定义为 public ManualResetEvent mh;
mh.WaitOne();
要求是要开三个线程,三个线程分别做不同的任务,其中两个线程每小时检查一次数据库,另一个线程是每天固定时间检查一次,对线程不熟,谁了解的帮我一下,谢谢
------解决思路----------------------
Thread t1 = new Thread(new ThreadStart(a));
t1.Start();
Thread t2 = new Thread(new ThreadStart(b));
t2.Start();
Thread t3 = new Thread(new ThreadStart(c));
t3.Start();
/// <summary>
/// 每日定时
/// </summary>
private static void a()
{
var date = DateTime.Now.ToString("yyyy-MM-dd 12:00:00");//每天12点做任务
//执行任务
if (DateTime.Parse(date) < DateTime.Now)//今日已过执行点
{
date = DateTime.Parse(date).AddDays(1).ToString();//去明日执行任务点时间
}
var ts1 =new TimeSpan(DateTime.Parse(date).Ticks);
var ts2 =new TimeSpan(DateTime.Now.Ticks);
var ts = ts1.Subtract(ts2).Duration();
Thread.Sleep((int)ts.TotalMilliseconds);//睡眠
}
/// <summary>
/// 每小时1
/// </summary>
private void b()
{
//执行任务
Thread.Sleep(3600 * 1000);//睡眠
}
/// <summary>
/// 每小时2
/// </summary>
private void c()
{
//执行任务
Thread.Sleep(3600 * 1000);//睡眠
}
------解决思路----------------------
如果非得用线程 就这样吧..
Thread t1 = new Thread(new ThreadStart(a));
t1.Start();
void a()
{
while(true)
{
if(datatime.now.minutes==1)
{
//你的代码 当然上面的1 你从0到59你爱写成几就写几...反正一个小时只有一个0-59
//至于一天执行一次 你就判断datetime.now.hours==5...
}
}
}
------解决思路----------------------
1、线程递归循环中不能直接执行数据库等操作,防止阻塞使用新的线程或异步委托都可以。
2、手动创建线程,要把线程设置为后台线程。
3、最好做个保存记录,另一个问题出现操作失败时有没有其他解决方案。
Thread.Sleep(24 * 60 * 60000); 这个方法并不是很好,你不能保证程序中途不重启。
两个线程每个小时检查一次数据库,可以使用一个线程搞定。
第一次启动程序时,保存2个DateTime值,第2个time值+几分钟。
分别判断TimeSpan,大于等于60分钟时执行一次,并且重新保存DateTime值。
------解决思路----------------------
代码太多,没有多少时间看。随便说几点。
如果你是一个Console程序,那么在Main中必须阻塞,不能让住进程结束。例如写
mh = new MaualResetEvent(false); // mh 定义为 public ManualResetEvent mh;
mh.WaitOne();
(使用系统线程池)启动一个线程,只需要写
ThreadPool.QueueUserWorkItem(h => method());就可以了,不需要写更多的代码。(其中的 => 只后的内容随便写可执行代码。
绝不要胡乱递归!要改为循环结构。
尽量不要写 Sleep(...) 阻塞代码。如果需要定时,应该使用系统定时器。系统定时器不需要什么线程阻塞,它是系统的硬件中断事件驱动的。
------解决思路----------------------
mh = new ManualResetEvent(false); // mh 定义为 public ManualResetEvent mh;
mh.WaitOne();