.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                 try
    40                 {
    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                             else
    51                             {
    52                                 LogHelper.WriteLog("当前数字:" + i);
    53                             }
    54                         }
    55                     }
    56                     else
    57                     {
    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 <?xml version="1.0" encoding="utf-8" ?>
    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 }

时间: 2024-11-09 00:20:55

.Net 指定时间段内定时执行的Windows服务(System.Threading.Thread)的相关文章

安装winform程序时自动安装windows服务

项目中遇到一个需求:安装winform程序时自动安装windows服务,且windows服务运行时反过来检测winform程序是否启动.如果没有则启动. 经过一番查阅已在win10下实现并运行正常.在此记录便于以后查看 实现思路:利用打包插件VS installer 有一个自定义操作,可以指定安装完成后运行的程序集,并在程序集中默认启动一个windows服务安装类 实现步骤:1.在winform程序所在解决方案中,添加一个vs installer打包项目, vs installer的使用不再累述

C#制作Windows service服务系列二:演示一个定期执行的windows服务及调试(windows service)

系列一: 制作一个可安装.可启动.可停止.可卸载的Windows service(downmoon原创) 系列二:演示一个定期执行的windows服务及调试(windows service)(downmoon) 系列三: windows service系列三--制作可控制界面的windows service 一.经常有人问起如何让程序定期自动执行? 除了像系统任务和SQL JOB/DTS等都可以满足不同的用户需求外,这里演示了如何做一个简单的windows serivce的框架.主要的功能是按照

Windows服务System权限下在当前用户桌面创建快捷方式C#实例程序

Windows服务一般运行在System权限下,这样权限比较高,方便执行一些高权限的操作. 但是,Environment.GetFolderPath等函数获取的也是System用户下的,而不是当前用户的. 解决方法 模拟当前用户,调用Environment.GetFolderPath等函数获取当前用户的路径,退出模拟 查看输出,可以看到模拟成功了: 第一行是当前用户的,第二行输出的是System用户的路径 获取完整的实例代码 支持WinXP及以上操作系统 原文地址:https://www.cnb

Windows服务定时执行任务

1.创建多线程类 /// <summary> /// 多线程 /// </summary> public abstract class MuliThread<T> { /// <summary> /// 线程 /// </summary> private static readonly List<Thread> Threads = new List<Thread>(); /// <summary> /// 日志

创建第一个windows服务

windows服务应用程序是一种长期运行在操作系统后台的程序,它对于服务器环境特别适合,它没有用户界面,不会产生任何可视输出,任何用户输出都回被写进windows事件日志. 计算机启动时,服务会自动开始运行,他们不要用户一定登陆才运行. 可以通过选择菜单"开始"-〉"控制面板"-〉"管理工具"-〉"服务"来查看现有系统中的服务,如下图: 创建一个windows服务 切换到代码视图修改. using System; using

.net windows 服务创建、安装、卸载和调试

原文:http://blog.csdn.net/angle860123/article/details/17375895 windows服务应用程序是一种长期运行在操作系统后台的程序,它对于服务器环境特别适合,它没有用户界面,不会产生任何可视输出,任何用户输出都回被写进windows事件日志.计算机启动时,服务会自动开始运行,他们不要用户一定登陆才运行. 可以通过选择菜单“开始”-〉“控制面板”-〉“管理工具”-〉“服务”来查看现有系统中的服务,如下图: 创建window 服务 新建一个wind

[转]Windows 服务

原文:http://www.cnblogs.com/hfliyi/archive/2012/08/12/2635290.html windows服务应用程序是一种长期运行在操作系统后台的程序,它对于服务器环境特别适合,它没有用户界面,不会产生任何可视输出,任何用户输出都回被写进windows事件日志.计算机启动时,服务会自动开始运行,他们不要用户一定登陆才运行. 可以通过选择菜单“开始”-〉“控制面板”-〉“管理工具”-〉“服务”来查看现有系统中的服务,如下图: 创建window 服务 新建一个

C#开发可以可视化操作的windows服务

使用C#开发自定义windows服务是一件十分简单的事.那么什么时候,我们需要自己开发windows服务呢,就是当我们需要计算机定期或者一直执行我们开发的某些程序的时候.这里我以一个WCF的监听服务为例,因为我是做一个局域聊天室,需要服务器端监听终端,所以我就开发了一个服务,以便控制此监听服务.然而,我们开发的windows服务,默认情况下是无法可视化的操作的,这里我就额外的开发一个工具来对此服务进行操作,效果图如下: 开发步骤: 1."新建项目"--"Window服务&qu

System.Windows.Forms.Timer、System.Timers.Timer、System.Threading.Timer的差别和分别什么时候用

一.System.Windows.Forms.Timer 1.基于Windows消息循环,用事件方式触发,在界面线程执行:是使用得比较多的Timer,Timer Start之后定时(按设定的Interval)调用挂接在Tick事件上的EvnetHandler.在这种Timer的EventHandler中可 以直接获取和修改UI元素而不会出现问题--因为这种Timer实际上就是在UI线程自身上进行调用的. 2.它是一个基于Form的计时器3.创建之后,你可以使用Interval设置Tick之间的跨