你的位置:首页 > ASP.net教程

[ASP.net教程].Net 指定时间段内定时执行的Windows服务(System.Threading.Thread)


  1. 创建一个Windows服务项目:解决方案(右击)——> 添加 ——> 新建项目——>项目类型选择Windows——>模板选择Windows服务 ,如图:
  2. 编写Windows服务程序
    创建后会生成两个文件 Program.cs 和 Service1.cs(我已重命名为MyService.cs),编写服务内容:

    具体服务代码:
     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 }

    View Code

    配置文件:

    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>

    View Code

    日志代码:

     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 }

    View Code