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 = ; i < ; i++)
    45. {
    46. if (!IsRunTime(beginTime, endTime))
    47. {
    48. Thread.Sleep( * );
    49. }
    50. else
    51. {
    52. LogHelper.WriteLog("当前数字:" + i);
    53. }
    54. }
    55. }
    56. else
    57. {
    58. Thread.Sleep( * );
    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()) || (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(, 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 学习系列】-- .Net 指定时间段内定时执行的Windows服务(System.Threading.Thread)的更多相关文章

  1. .Net 指定时间段内定时执行的Windows服务(System.Threading.Thread)

    创建一个Windows服务项目:解决方案(右击)——> 添加 ——> 新建项目——>项目类型选择Windows——>模板选择Windows服务 ,如图: 编写Windows服务 ...

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

    系列一: 制作一个可安装.可启动.可停止.可卸载的Windows service(downmoon原创) 系列二:演示一个定期执行的windows服务及调试(windows service)(down ...

  3. SpringMVC学习系列-后记 解决GET请求时中文乱码的问题

    SpringMVC学习系列-后记 解决GET请求时中文乱码的问题 之前项目中的web.xml中的编码设置: <filter> <filter-name>CharacterEnc ...

  4. paraview显示指定时间段的时均图(两种方法)

    方法一: 首先计算以后会得到每个时刻的网格数据,如下图: 但是我们只想要比如最后2s的数据,如果直接导入,paraview会把从0s时刻的数据全部加载,做时均图的时候也就是对整个时间段做时均,不是我们 ...

  5. 全网最详细的Git学习系列之安装各个Git图形客户端(Windows、Linux、Mac系统皆适用ing)(图文详解)

    不多说,直接上干货! 目前Git图形客户端 TortoiseGit .SourceTree .GitUp .SmartGit .QGit .GitX .Gitnub.Tower .Git-cola . ...

  6. 全网最详细的Git学习系列之介绍各个Git图形客户端(Windows、Linux、Mac系统皆适用ing)(图文详解)

    不多说,直接上干货! 一.TortoiseGit - The coolest Interface to Git Version Control TortoiseGit 是 TortoiseSVN 的  ...

  7. Windows Service 学习系列(一):建立简单的Windows service

    参考:https://www.cnblogs.com/cncc/p/7170951.html 一.开发环境 操作系统:Windows 7 X64 开发环境:VS2017 编程语言:C# .NET版本: ...

  8. ajax跨域POST时执行OPTIONS请求服务端返回403forbidden的解决方法

    ajax访问服务端restful api时,由于contentType类型的原因,浏览器会先发送OPTIONS请求. 本人服务端用的是spring mvc框架,web服务器用的是tomcat的,以下给 ...

  9. LINQ学习系列-----2.3 迭代器带来的延迟查询

    此篇博文承接上一篇博文: LINQ学习系列-----2.2 迭代器 一.第一次执行                      废话不多说,上源码: 执行结果下图: 为什么会这样?其实原因很简单 fro ...

随机推荐

  1. spark on yarn模式下内存资源管理(笔记1)

    问题:1. spark中yarn集群资源管理器,container资源容器与集群各节点node,spark应用(application),spark作业(job),阶段(stage),任务(task) ...

  2. Java语法基础-异常处理

    异常处理类层次结构图 检查异常与非检查异常 非检查异常(unckecked exception):Error 和 RuntimeException 以及他们的子类.javac在编译时,不会提示和发现这 ...

  3. ORM-PetaPoco

    PetaPoco有以下特色:--------------------------20170715姜彦 微小,没有依赖项……单个的C#文件可以方便的添加到任何项目中. 工作于严格的没有装饰的Poco类, ...

  4. (转)Spring使用AspectJ进行AOP的开发:注解方式

    http://blog.csdn.net/yerenyuan_pku/article/details/69790950 Spring使用AspectJ进行AOP的开发:注解方式 之前我已讲过Sprin ...

  5. WPF学习- 新建项目后自定义Main()[Type 'App' already defines a member called 'Main' with the same parameter types]

    问题点: 在App.xaml.cs中自己添加Main方法,编译会出现如下报错: 错误 CS0111 类型“App”已定义了一个名为“Main”的具有相同参数类型的成员  错误 Type 'App' a ...

  6. 解决【npm ERR! Unexpected end of JSON input while parsing near '...sh_time":141072930277'】方案

    问题描述执行npm install的时候报错npm ERR! Unexpected end of JSON input while parsing near '...sh_time":141 ...

  7. idea文件全部变红, 文件全部红色

    idea如果当前project用了版本控制器,其下面新建的所有的项目默认都是加入到版本控制里面,所以项目名称和文件都是红色的,如图: 看起来非常不爽, 那么如何解决呢? File–>Settin ...

  8. 04C#运算符

    C#运算符 运算符分类 与C语言一样,如果按照运算符所作用的操作数个数来分,C#语言的运算符可以分为以下几种类型: l  一元运算符:一元运算符作用于一个操作数,例如:-X.++X.X--等. l  ...

  9. TortoiseSVN文件夹操作

    (1).安装SVN·客户端 (2) 建立库: 1.新建文件夹,目录和文件夹名称最好都用英文,不要使用中文: 2.打开文件夹,在空白处按下“shift键+鼠标右键”: 3.在弹出的菜单中选择“Torto ...

  10. mxnet.base.MXNetError: src/imperative/./imperative_utils.h:70: Check failed: inputs[i]->ctx().dev_mask() == ctx.dev_mask() (1 vs. 2)

    mxnet 训练错误: mxnet.base.MXNetError: [14:42:22] src/imperative/./imperative_utils.h:70: Check failed: ...