如何在C#写的WINDOWS服务中,使线程在固定的时间运行?
只存在一个线程,这个线程希望每隔几个小时执行一次,例如每天的1点,5点,9点,13点,17点,21点!
在不论什么时间启动该服务,只要它不在这几个时间上,就不让它运行!!
想问问有没有什么好的方法?
我想到一个是在该线程start之前,先获得当前时间的HOUR,如果不在这几个的话,再一一判断,当前时间距以上以个时间断有多长时间,然后让线程sleep这些时间
不过我觉得这个办法太笨,有没有更好的方法呢?
------解决方案--------------------Sleep一分钟,醒来的时候看看到点没,没有就继续Sleep一分钟。
没有必要追求极致性能,每一分钟才执行一次操作的程序的开销用户根本感觉不出来。
------解决方案--------------------感觉 既然是windows服务,如果让它开就自动运行,那系统服务本来就是一直在运行,直接while(true)就可以了.  
不需要什么timer或sleep了.
在start里写
while(true)
{
  switch(当前时间)//判断当前时间是否是1点,5点,9点,13点,17点,21点
  {
   case 1点:
   //执行你的代码
   //....其他几点类似就行了.
  }    
}
------解决方案--------------------如果不要求太精确,可以在线程循环里判断是否在指定的时间前后的一个范围呢,如果不在就每次循环休眠一分钟。
如果要求时间比较精确,休眠的间隔就要比较短,但太短就会占用太多的CPU时间,那么可以用折半逼近指定的时间范围。
------解决方案--------------------这是我以前写的,希望对你有帮助。
呵呵。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.ServiceProcess;
using System.Text;
using System.IO;
using System.Timers;
namespace TickService
{
   public partial class Service1 : ServiceBase
   {
       Timer timer1;
       public Service1()
       {
           InitializeComponent();
           timer1 = new Timer();
           //Set the interval of timer to 3 seconds.
           timer1.Interval = 3000;
           //Enable the timer.
           timer1.Enabled = true;
           timer1.Elapsed+=new ElapsedEventHandler(timer1_Elapsed);
       }
       protected override void OnStart(string[] args)
       {
           // TODO: Add code here to start your service.          
           //Append the text to the sample file.
           StreamWriter writer = File.AppendText(@"C:\sample.txt");
           writer.WriteLine("Start");
           writer.Close();
       }
       protected override void OnStop()
       {
           // TODO: Add code here to perform any tear-down necessary to stop your service.
           //Append the text Stop to the C:\sample.txt file.
           StreamWriter writer = File.AppendText(@"C:\sample.txt");
           writer.WriteLine("Stop");
           writer.Close();
       }
       private void timer1_Elapsed(object sender, EventArgs e)
       {
           //Set the enable property to false.
           //timer1.Enabled = false;
           //Append the text Tick to the C:\sample.txt file.
           StreamWriter writer = File.AppendText(@"C:\sample.txt");
           writer.WriteLine("Tick");
           writer.Close();
           //timer1.Enabled = true;
       }
   }
}