使用C#创建一个简单的Windows服务

服务功能:在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文件)中启动,这通常在有多个服务时发生;

2008-09-09补充:使用线程实现定时操作
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()));
            }
        }
    }
}


评论: 0 | 引用: 0 | 查看次数: 9842
发表评论
登录后再发表评论!