1 using System; 2 using System.Configuration; 3 using System.ServiceProcess; 4 using System.Threading; 5 6 namespace WindowsServiceTest 7 { 8 public partial class MyService : ServiceBase 9 {10 11 private Thread _thread = null;12 private bool serviceIsRun = false; // 是否一直运行13 14 public MyService()15 {16 InitializeComponent();17 }18 19 protected override void OnStart(string[] args)20 {21 LogHelper.WriteLog("服务启动...");22 serviceIsRun = true;23 _thread = new Thread(CheckSrv);24 _thread.Start();25 }26 27 protected override void OnStop()28 {29 serviceIsRun = false;30 LogHelper.WriteLog("服务停止...");31 }32 33 protected void CheckSrv()34 {35 var beginTime = ConfigurationManager.AppSettings["BeginTime"];36 var endTime = ConfigurationManager.AppSettings["EndTime"];37 while (serviceIsRun)38 {39 try40 {41 if (IsRunTime(beginTime, endTime))42 {43 // TODO:44 for (int i = 0; i < 10; i++)45 {46 if (!IsRunTime(beginTime, endTime))47 {48 Thread.Sleep(1000 * 2);49 }50 else51 {52 LogHelper.WriteLog("当前数字:" + i);53 }54 }55 }56 else57 {58 Thread.Sleep(1000 * 5);59 LogHelper.WriteLog("未达到服务执行时间...");60 }61 }62 catch (Exception ex)63 {64 LogHelper.WriteLog("服务发生异常:" + ex.ToString());65 }66 }67 }68 69 /// <summary>70 /// 判断程序是否在设置运行时间内71 /// </summary>72 /// <param name="startTime">开始执行时间</param>73 /// <param name="overTime">执行结束时间</param>74 /// <returns>true:在执行时间内,false:在执行时间外</returns>75 private bool IsRunTime(string startTime, string overTime)76 {77 var flag = false;78 79 var beginTime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd") + " " + startTime);80 var endTime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd") + " " + overTime);81 82 if (beginTime <= endTime) // 当天83 {84 flag = beginTime <= DateTime.Now && DateTime.Now <= endTime;85 }86 else // 跨天87 {88 var zeroTime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd") + " 00:00");89 flag = (beginTime <= DateTime.Now && DateTime.Now <= zeroTime.AddDays(1)) || (zeroTime <= DateTime.Now && DateTime.Now <= endTime);90 }91 92 return flag;93 }94 }95 }
配置文件:
1 <??>2 <configuration>3 <appSettings>4 <add key="LogPath" value="Log"/>5 <add key="BeginTime" value="10:28"/>6 <add key="EndTime" value="10:38"/>7 </appSettings>8 </configuration>
日志代码:
1 using System; 2 using System.Configuration; 3 using System.IO; 4 using System.Text; 5 6 namespace WindowsServiceTest 7 { 8 internal class LogHelper 9 {10 /// <summary>11 /// 记录日志12 /// </summary>13 /// <param name="logContext">日志内容</param>14 public static void WriteLog(string logContext)15 {16 var logPath = AppDomain.CurrentDomain.BaseDirectory + ConfigurationManager.AppSettings["LogPath"].ToString();17 if (!Directory.Exists(logPath))18 {19 Directory.CreateDirectory(logPath);20 }21 var filePath = logPath + "\\" + DateTime.Now.ToString("yyyy-MM-dd") + ".txt";22 var fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write);23 var m_streamWriter = new StreamWriter(fs);24 m_streamWriter.BaseStream.Seek(0, SeekOrigin.End);25 var sb = new StringBuilder();26 if (!string.IsNullOrEmpty(logContext))27 {28 sb.Append(Environment.NewLine);29 sb.Append(logContext);30 }31 sb.Append(" "+DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:ffff")+Environment.NewLine);32 m_streamWriter.WriteLine(sb.ToString());33 m_streamWriter.Flush();34 m_streamWriter.Close();35 fs.Close();36 }37 }38 }
原标题:.Net 指定时间段内定时执行的Windows服务(System.Threading.Thread)
关键词:.NET