热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用Windowsservice创建一个定时器执行定时任务

一、需求使用windowsservice创建一个定时任务,定时执行数据处理任务,并记录日志,发送邮件。 二、实现1、打开VS新建一个windowsService程序,我命名为Tim

一、需求

使用windows service 创建一个定时任务,定时执行数据处理任务,并记录日志,发送邮件。

 


二、实现

1、打开VS新建一个windows Service程序,我命名为TimerService

注意:.NET Framwork框架的选择要与你电脑上的框架一致,我这里选择的是4.7.2

 

2、在Service1设计器中右击空白处选择查看代码

 

 

 

3.在Service1.cs中设定
Onstart方法定义定时器的开始执行,执行的时间间隔,以及时间间隔达到后所要执行的方法。

执行了一个文件写入任务,代码如下:

using System;
using System.IO;
using System.Net.Mail;
using System.ServiceProcess;
using System.Timers;
using Outlook = Microsoft.Office.Interop.Outlook;
namespace TimerService
{
public partial class Service1 : ServiceBase
{
private Timer timer;
public Service1()
{
InitializeComponent();
}
///


/// Start Service
///

///


protected override void OnStart(string[] args)
{
timer
= new Timer(60 * 1000);
timer.Elapsed
+= new ElapsedEventHandler(Timer_Elapsed);
timer.Start();
WriteLog(
"Service Start." + " " + DateTime.Now.ToString());
}
///


/// Stop Service
///

protected override void OnStop()
{
WriteLog(
"Service Stop." + " " + DateTime.Now.ToString());
timer.Stop();
timer.Dispose();
}
///
/// Execute Service
///

///


///


protected void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
WriteLog(
"Service Execute……" + " " + DateTime.Now.ToString());
var res = Send();
WriteLog(res);
}
///


/// Write Log
///

///


protected void WriteLog(string str)
{
string filePath = AppDomain.CurrentDomain.BaseDirectory + "Log.txt";
StreamWriter sw
= null;
if (!File.Exists(filePath))
{
sw
= File.CreateText(filePath);
}
else
{
sw
= File.AppendText(filePath);
}
sw.Write(str
+ Environment.NewLine);
sw.Close();
}
///


///
///

///


public string Send()
{
try
{
SmtpClient client
= new SmtpClient("smtp.wdc.com", 25);
client.UseDefaultCredentials
= true;
MailAddress
from = new MailAddress("huichun.wang@wdc.com");
MailAddress to
= new MailAddress("huichun.wang@wdc.com");
MailAddress cc
= new MailAddress("huichun.wang@wdc.com");
MailMessage message
= new MailMessage();
message.From
= from;
message.To.Add(to);
message.CC.Add(cc);
//message.Attachments.Add(new Attachment("test.txt"));
message.Body = "大家好,blablablabla邮件正文";
message.BodyEncoding
= System.Text.Encoding.UTF8;
message.Subject
= "邮件标题";
message.SubjectEncoding
= System.Text.Encoding.UTF8;
client.Send(message);
message.Dispose();
message
= null;
client.Dispose();
client
= null;
return "发送正常";
}
catch (Exception e)
{
return "异常:" + e.Message;
}
}
}
}

 

 

4、在Service1设计器中右击空白处,选择添加安装程序,会添加一个ProjectInstaller设计器

 

 

 

 

5、在ProjectInstaller设计器中选择serviceProcessInstaller,右击查看属性,将Account的值改为LocalSystem

 

 

 

 

6、在ProjectInstaller设计器中选择serviceInstaller1,右击查看属性,ServiceName就是服务中显示的名称,将其命名TimerService

 

 

 

 

7、右击解决方案,点击生成解决方案

 

 

三、安装
1、打开刚刚新建项目所在的文件夹,找到bin文件下面的debug文件夹,比如:C:\Users\Administrator\Source\Repos\TimerService\bin\debug,里面有个TimerService.exe应用程序,就是我们所要执行的项目

 

2、打开文件夹C:\Windows\Microsoft.NET\Framework\v4.0.30319,可以看到里面有一个InstallUtil.exe的应用程序,这就是我们要的安装工具,这里的Framework的版本与我们项目的Framework版本保持一致

 

3、打开cmd输入cd C:\Users\Administrator\Source\Repos\TimerService\bin\Debug指令,

然后再输入C:\Windows\Microsoft.NET\Framework64\v4.0.30319\installutil.exe /i TimerService.exe,即可完成安装。

PS:需要注意,cmd需要以管理员身份运行,否则可能出现安装失败的情况(提示权限不足,如下图2)

 

安装失败提示: 

 

 

4、启动任务管理器,点击服务,找到名称TemrService的服务,右击启动,即可将创建的定时服务启动,这里的服务名称就是我们在项目的serviceInstaller1的属性里面设置的serviceName

 

 

 

5、在我们的C:\Users\Administrator\Source\Repos\TimerService\bin\Debug文件下面会发现多了一个log.txt的文件,就是我们在项目中创建的日志文件,打开即可看到项目正常执行。

 

 

 

 

四、卸载
卸载服务需要在cmd中输入以下指令即可

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\installutil.exe /u TimerService.exe

 

 

 

参考原文链接:https://blog.csdn.net/qingyou2006/article/details/126464305



推荐阅读
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 本文介绍了Python字典视图对象的示例和用法。通过对示例代码的解释,展示了字典视图对象的基本操作和特点。字典视图对象可以通过迭代或转换为列表来获取字典的键或值。同时,字典视图对象也是动态的,可以反映字典的变化。通过学习字典视图对象的用法,可以更好地理解和处理字典数据。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
author-avatar
心窝子难受呢
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有