服务功能:在C:\ServiceLog.log中记录服务的开始和停止时间,在指定间隔时间重复执行一些操作,并在C:\ServiceLog.log中记录时间。
步骤1:打开Microsoft Visual Studio
2008,新建一个Windows服务;
步骤2:打开Service1.cs代码页,输入下边代码;
Service1.cs:
复制内容到剪贴板 程序代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.ServiceProcess;
using System.Text;
using System.IO;
namespace WindowsService1
{
public partial class Service1 :
ServiceBase
{
public
Service1()
{
InitializeComponent();
}
///
<summary>
///
启动服务
///
</summary>
///
<param name="args"></param>
protected
override void OnStart(string[] args)
{
if
(!File.Exists(@"C:\ServiceLog.log"))
{
File.Create(@"C:\ServiceLog.log");
}
File.AppendAllText(@"C:\ServiceLog.log",string.Format("启动时间:{0}\r\n",
DateTime.Now.ToString()));
//设置一个定时器
System.Timers.Timer
timer1 = new System.Timers.Timer();
timer1.Interval
= 3000;//间隔时间
timer1.Elapsed
+= new System.Timers.ElapsedEventHandler(Done);//达到间隔时间执行的处理程序
timer1.AutoReset
= true;//每次间隔结束时引发 System.Timers.Timer.Elapsed 事件,如果仅在第一次引发设置为false
timer1.Enabled
= true;
}
///
<summary>
///
停止服务
///
</summary>
protected
override void OnStop()
{
File.AppendAllText(@"C:\ServiceLog.log",string.Format("停止时间:{0}\r\n",
DateTime.Now.ToString()));
}
///
<summary>
///
定时任务
///
</summary>
///
<param name="sender"></param>
///
<param name="e"></param>
protected
void Done(object sender, EventArgs e)
{
//这边可以做些其他操作
File.AppendAllText(@"C:\ServiceLog.log",
string.Format("执行定时任务:{0}\r\n", DateTime.Now.ToString()));
}
}
}
步骤3:在Service1.cs设计视图上点击右键,选择"添加安装程序",会添加一个新类
ProjectInstaller 和两个安装组件 ServiceProcessInstaller 和 ServiceInstaller;
步骤4:打开ProjectInstaller.cs设计视图,设置serviceInstaller1组件的ServiceName属性值(服务名称)和StartType属性值(服务启动类型,通常设置为Automatic),设置serviceProcessInstaller1组件的Account属性值(运行服务的帐户类型,通常设置为LocalSystem),三个属性设置完后本服务创建完成;
步骤5:安装服务。生成项目后在Bin文件中可找到生成的服务WindowsService1.exe,安装服务需要使用installutil.exe这个工具,可在C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\中找到installutil.exe,安装语法为:
引用内容
installutil.exe WindowsService1.exe
卸载的语法为:
引用内容
installutil.exe /u WindowsService1.exe
附1:快速安装/卸载服务批处理
服务安装.bat:
复制内容到剪贴板 程序代码
@echo off
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\installutil.exe
%1
::似乎一次net start并不能启动服务,下边进行三次net start
net start 服务名称
net start 服务名称
net start 服务名称
服务卸载.bat:
复制内容到剪贴板 程序代码
@echo off
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\installutil.exe
/u %1
将WindowsService1.exe拉到"服务安装.bat"或"服务卸载.bat"可快速完成服务的安装和卸载。如若发现使用"installutil.exe
/u"卸载服务后在服务控制管理器他仍然存在,可尝试使用"sc delete 服务名称"命令来删除。
附2:ServiceInstaller 组件StartType属性值说明
Manual: 服务安装后,必须手动启动;
Automatic: 每次计算机重新启动时,服务都会自动启动;
Disabled: 服务无法启动;
附3:ServiceProcessInstaller 组件Account属性值说明
User:
当服务已安装并且在由网络上的单一用户指定的帐户的上下文中运行时,该类型将使系统要求提供有效的用户名和密码;
LocalService:
该类型在用作本地计算机上的非特权用户并向任意远程服务器显示匿名凭据的帐户的上下文中运行;
LocalSystem:
该类型在提供多种本地特权并向任意远程服务器显示计算机凭据的帐户的上下文中运行;
NetworkService:
该类型在用作本地计算机上的非特权用户并向任意远程服务器显示计算机凭据的帐户的上下文中运行;
附4:启动服务出错,提示"错误 1083:
配置成在该可执行程序中运行的这个服务不能执行该服务。"
导致此错误的原因可能是以下几种:
·服务的ServiceName属性值和他在安装程序中的ServiceName属性值不一致;
·试图启动的服务没有在Main函数(Program.cs文件)中启动,这通常在有多个服务时发生;
补充:使用线程实现定时操作
Service1.cs:
复制内容到剪贴板 程序代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.ServiceProcess;
using System.Text;
using System.IO;
using System.Threading;
namespace WindowsService1
{
public partial class Service1 :
ServiceBase
{
private
Thread MainThread;
public
Service1()
{
InitializeComponent();
}
///
<summary>
///
启动服务
///
</summary>
///
<param name="args"></param>
protected
override void OnStart(string[] args)
{
if
(!File.Exists(@"C:\ServiceLog.log"))
{
File.Create(@"C:\ServiceLog.log");
}
File.AppendAllText(@"C:\ServiceLog.log",string.Format("启动时间:{0}\r\n",
DateTime.Now.ToString()));
//创建线程实例
MainThread
= new Thread(new ThreadStart(Done));
MainThread.Priority
= ThreadPriority.Lowest;
MainThread.Start();
}
///
<summary>
///
停止服务
///
</summary>
protected
override void OnStop()
{
File.AppendAllText(@"C:\ServiceLog.log",string.Format("停止时间:{0}\r\n",
DateTime.Now.ToString()));
MainThread.Abort();
}
///
<summary>
///
定时任务
///
</summary>
///
<param name="sender"></param>
///
<param name="e"></param>
protected
void Done()
{
while
(true)
{
System.Threading.Thread.Sleep(3000);
//这边可以做些其他操作
File.AppendAllText(@"C:\ServiceLog.log",
string.Format("执行定时任务:{0}\r\n", DateTime.Now.ToString()));
}
}
}
}
相关文章
- 04-30【SpringBoot】使用IDEA创建一个SpringBoot服务,并创建三个restful风格的接口
- 04-30使用Dockerfile创建一个带 ssh 服务的基础镜像
- 04-30创建一个超级简单TCP交互的服务器/客户端
- 04-30? 原创: 铲子哥 搜狗测试 今天 shell编程的时候,往往不会把所有功能都写在一个脚本中,这样不太好维护,需要多个脚本文件协同工作。那么问题来了,在一个脚本中怎么调用其他的脚本呢?有三种方式,分别是fork、source和exec。 1. fork 即通过sh 脚本名进行执行脚本的方式。下面通过一个简单的例子来讲解下它的特性。 创建father.sh,内容如下: #!/bin/bas
- 04-30readline()函数:可以读取一行 分析: 1.创建一个file对象 2.使用循环读取每一行的内容 直到读取内容为空 3.将读取到的内容写
- 04-30创建一个超级简单的UDP服务器 / 客户端
- 04-30创建一个超级简单TCP交互的服务器/客户端
- 04-30(转)微服务_创建一个简单的Eureka注册中心
- 04-30使用vue/cli 创建一个简单的项目
- 04-30C#创建控制台项目引用Topshelf的方式,部署windows服务。