C# Windows Service入门

  Microsoft Windows 服务(过去称为 NT 服务)允许用户创建可在其自身的 Windows 会话中长时间运行的可执行应用程序。 这些服务可在计算机启动时自动启动,可以暂停和重启,并且不显示任何用户界面。 这些功能使服务非常适合在服务器上使用,或者需要长时间运行的功能(不会影响在同一台计算机上工作的其他用户)的情况。感觉作用跟Windows任务计划差不多,但是任务计划可以灵活地设置运行可执行应用程序的时间,可以是带用户界面的程序,Window服务更像隐形英雄,默默在后台运行。

本次演示使用环境:VS2019、windows 10专业版

1、创建Windows Service项目

 

2、默认创建的项目文件目录如下:

 

 【可选】将Service1重命名为MyService

a)向MyService设计器中添加 EventLog控件

 

默认创建的service1.cs代码中包括构造函数、重载的OnStart和重载的OnStop函数,OnStart和OnStop函数分别在启动和停止服务时会触发。

直接粘贴上写好的代码,这里没啥功能就是通过事件日志和往一个文本文件中不断写入一句话来显示服务一直在运行。

using System;
using System.Diagnostics;
using System.IO;
using System.ServiceProcess;
using System.Text;
using System.Timers;

namespace FirstWindowsServiceApp
{
    public partial class MyService : ServiceBase
    {
        public MyService()
        {
            InitializeComponent();

            if (!System.Diagnostics.EventLog.SourceExists("MyEventSource"))
            {
                System.Diagnostics.EventLog.CreateEventSource("MyEventSource", "MyEventLog");
            }
            //事件查看器详情 Provider Name属性
            eventLog1.Source = "MyEventSource";
            //将在事件查看器中看到的服务日志
            eventLog1.Log = "MyEventLog";
        }

        protected override void OnStart(string[] args)
        {
            eventLog1.WriteEntry("Personal Windows Service In OnStart");
            //需要添加 using System.Timers; 注意命令空间
            //利用Timer实现间隔固定时间触发一次文本文件写入
            Timer timer = new Timer
            {
                Interval = 30000, //30秒
                Enabled = true
            };
            timer.Elapsed += Timer_Elapsed;
            timer.Start();
        }

        protected override void OnStop()
        {
            eventLog1.WriteEntry("Personal Windows Service In OnStop");
        }

        private void Timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            //分别在事件查看器 EventData 级别 事件ID中可以看到
            eventLog1.WriteEntry("Monitoring the System", EventLogEntryType.Information, eventId++);

            WriteToDisk();
        }

        private void WriteToDisk()
        {
            string path = @"D:\Record.txt";

            using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write))
            {
                string strContent = "MyWindwosServices:    Service Info  " + DateTime.Now.ToString() + "\n";
                //将字符串转成byte数组
                byte[] byteFile = Encoding.UTF8.GetBytes(strContent);
                fs.Position = fs.Length;
                //参数:要写入到文件的数据数组,从数组的第几个开始写,一共写多少个字节
                fs.Write(byteFile, 0, byteFile.Length);
            }
        }

        private int eventId = 0;
    }
}

 2、下一步就是

 

 

Account代表认证方式,这里选LocalSystem,默认不设置的话,在注册服务时会要求输入用户名和密码。

 

 

 3、注册服务

 

 

 

 卸载对应的是 installutil /u "可执行应用程序完整路径"

在服务里就可以看到定义的服务里,手工启动后就可以,服务就开始运行了,就可以通过事件查看器和

 

 

 

 

该文章主要用于入门,写得比较简单,主要以截图为主。如果实践过程中有任何疑问,欢迎交流。

如果内容对您有帮助,可以扫码给我打赏,你的鼓励是我前进的动力。

 

posted @ 2021-11-24 15:24  业荒于嬉  阅读(492)  评论(0编辑  收藏  举报