关于多线程的有关问题!求帮助!

关于多线程的问题!求帮助!!!!
要求是要开三个线程,三个线程分别做不同的任务,其中两个线程每小时检查一次数据库,另一个线程是每天固定时间检查一次,对线程不熟,谁了解的帮我一下,谢谢
------解决思路----------------------

            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值。
------解决思路----------------------
引用:
class Program
    {
        private readonly static AliUserBusiness aliUserBusiness = new AliUserBusiness();
        private readonly static AliProductBusiness aliProductBusiness = new AliProductBusiness();
        private readonly static AliAppKeyBusiness aliAppKeyBusiness = new AliAppKeyBusiness();
        private static AliUser aliUser = new AliUser();
        static void Main(string[] args)
        {
            Thread thread = new Thread(new ThreadStart(ThreadD));
            thread.Start();

            Thread thread2 = new Thread(new ThreadStart(refreshtoken));
            thread2.Start();
        }
        private static void ThreadD()
        {
            //获取所有用户信息
            IList<AliUser> list = aliUserBusiness.GetAliUserList("");
            if (list.Count > 0)
            {
                for (int i = 0; i < list.Count; i++)
                {
                    TimeSpan ts = DateTime.Now - list[i].ReLastTokenDate.Value;
                    if (ts.TotalHours >= 9)
                    {
                        Token token = ApiToken.RefreshToken(list[i].refresh_token);
                        //刷新access_token令牌
                        aliUserBusiness.UpdateAccess_token(list[i].memberId, token.access_token);
                        Console.WriteLine("更新成功!");
                    }
                    else
                    {
                        Console.WriteLine("令牌未过期!");
                    }
.................................
    }
我把我代码贴出了大家帮我看看哪些地方要改,或者不合理,两个必须开启两个线程,我用不懂线程,不知道能不能这样想,大家指点下,谢谢


代码太多,没有多少时间看。随便说几点。

如果你是一个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();