隐藏

C# 编写windows服务及服务的安装、启动、删除、定时执行任务

发布:2021/12/25 18:24:36作者:管理员 来源:本站 浏览次数:886

一、编写windows服务 

1、VS2017  - 创建服务Myservice

2、创建好项目之后 --- >> 双击 Service1.cs  ---- >>  出现一个设计界面   ---->> 右键界面  --- >> 弹出对话框选择  ”添加安装程序“

3、在设计界面修改 serviceProcessInstaller1的属性 Account 为 LocalSystem  (也可用代码修改)

4、在设计界面修改 serviceInstaller1 的属性: display 为  myfirstservice  ;    description 为 我的首个服务  ;   StartType 为 Automatic

5、修改Service1.cs 代码如下:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;

namespace myservice
{
    public partial class Service1 : ServiceBase
    {
        public Service1()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            // TODO: 在此处添加代码以启动服务。
            System.IO.File.AppendAllText(@"D:\Log.txt", " Service Start :" + DateTime.Now.ToString());
        }

        protected override void OnStop()
        {
            // TODO: 在此处添加代码以执行停止服务所需的关闭操作。
            System.IO.File.AppendAllText(@"D:\Log.txt", " Service Stop :" + DateTime.Now.ToString());
        }
    }
}

6、生成解决方案,可以在项目的dubug目录中找到 myservice.exe

二、SC命令=====安装、开启、配置、关闭windows服务

1、将myservice.exe放在英文目录下,我的是  d:\myservice.exe

2、在cmd中,转到D:并执行以下使命令进行服务安装和启动(这里的myserv 是自定义的名字)

sc create myserv  binPath= "d:/myservice.exe"

sc config  myserv start= auto                      //(自动)   (DEMAND----手动、DISABLED----禁用) 并且start连着=   ,而=的后面有一个空格

net start  myserv         

可以看到d盘下已生成了log.txt

3.删除服务,执行以下代码

  sc delete myserv

4、为方便使用,可编辑为bat批处理文件

@echo.服务启动......  
@echo off  
@sc create myserv1 binPath= "d:\demo.exe"  
@net start myserv1
@sc config myserv1 start= AUTO  
@echo off  
@echo.启动完毕!  
@pause

5.或在程序中用以下代码安装(参考http://www.cnblogs.com/pingming/p/5115320.html)
复制代码

//安装服务
string path = @"D:\demo.exe";
                    Process.Start("sc", "create myDemo binPath= \"" + path + "\" ");
                    Console.WriteLine("安装成功");


//卸载服务
                    Process.Start("sc", "delete KJLMDemo");
                    Console.WriteLine("卸载成功");
                    break;

复制代码

6、定时执行任务:参考 https://www.cnblogs.com/Beau/p/3491063.html
复制代码

//开始事件
        protected override void OnStart(string[] args)
        {
             //定时事件
            MyTimer();
        }

        //结束事件
        protected override void OnStop()
        {
            writeLog("服务结束时间:"  + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
        }


        //实例化System.Timers.Timer   
        private void MyTimer()
        {
            System.Timers.Timer MT = new System.Timers.Timer(30000);
            MT.Elapsed += new System.Timers.ElapsedEventHandler(MTimedEvent);
            MT.Enabled = true;

        }

        //构造System.Timers.Timer实例   间隔时间事件   
        private void MTimedEvent(object source, System.Timers.ElapsedEventArgs e)
        {

            //实现方法
            
        }