首页 技术 正文
技术 2022年11月18日
0 收藏 744 点赞 4,688 浏览 4213 个字

一、查看已有的Windows服务

选择菜单“开始”-〉“控制面板”-〉“管理工具”-〉“服务”来查看现有系统中的服务

C# Windows服务的创建、安装、调试

二、C#中创建 Windows 服务

1、Visual Studio=> 新建 => 项目 => Windows 服务

C# Windows服务的创建、安装、调试

2、重命名Service1.cs文件名为容易识别功能的文件名,这里我重命名成 MyFirstWinService.cs,如果类名改了,需要在 Program.cs文件的 Main() 方法里面的 new 对象也相应改过来

C# Windows服务的创建、安装、调试

3、在此文件的设计视图中右键,在弹出的菜单中选择添加安装程序

C# Windows服务的创建、安装、调试

4、项目会自动生成安装文件 ProjectInstaller.cs ,并且分别设置 serviceIntaller1 与 serviceProcessInstaller1 的属性。

C# Windows服务的创建、安装、调试

C# Windows服务的创建、安装、调试

C# Windows服务的创建、安装、调试

5、到这里,服务的安装程序与框架已经搭建完毕

三、Windows服务的安装

1、新建安装服务的批处理文件

Install.bat

 


C# Windows服务的创建、安装、调试

C# Windows服务的创建、安装、调试%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe WindowsServiceTest.exe
C# Windows服务的创建、安装、调试Net Start ServiceTest
C# Windows服务的创建、安装、调试

2、新建卸载服务的批处理文件

Uninstall.bat

 


C# Windows服务的创建、安装、调试

C# Windows服务的创建、安装、调试net stop ServiceTest
C# Windows服务的创建、安装、调试%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe /u WindowsServiceTest.exe
C# Windows服务的创建、安装、调试

3、将批处理文件放入项目的bin->Debug文件夹下面,这样就可以方便使用程序控制服务的安装和卸载。

C# Windows服务的创建、安装、调试

4、双击运行 Install.bat 进行自动安装 Windows 服务

5、安装成功后,可以进入Windows 服务 管理器,对刚才安装的服务设置启动方式:

C# Windows服务的创建、安装、调试

新安装的服务一般是不会启动的,需要我们 点击上图中的启动按钮进行启动

四、Windows 服务开发过程中的调试

通过附加进程的方式调试Windows 服务,此方法必须先把写好的服务进行编译生成可执行的exe安装程序,并安装启动服务后,才可以进行附加此服务进程。

1、首先要对服务进行安装,然后启动服务。

2、打开VS项目,选择菜单 调试->附加到进程 选项,选择你的服务进程(如果找不到可以勾选 显示所有用户进程 选项)就可以了。如下图:

C# Windows服务的创建、安装、调试

windows 服务实例:

每隔设置时间执行某段代码

internal static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        private static void Main()
        {
            ServiceBase[] ServicesToRun;
            ServicesToRun = new ServiceBase[]
            {
                new OrderUpdateService()
            };
            ServiceBase.Run(ServicesToRun);
        }
    }

重点code:

using System;
using System.Configuration;
using System.ServiceProcess;
using System.Threading;
using CRM.Services.Service;
using Castle.Windsor;
using Crm.DataSync.Installer;
using log4net;

public partial class OrderUpdateService : ServiceBase
    {
        private static readonly ILog Log = LogManager.GetLogger(typeof(OrderUpdateService));
        private static Timer _timer;
        private static bool _timerRunning;
        private static Timer _signTimer;
        private static bool _signTimerRunning;

static readonly OrderUpdateNew Service = new OrderUpdateNew();

public OrderUpdateService()
        {
            InitializeComponent();
        }

protected override void OnStart(string[] args)
        {
            try
            {
                Log.Info(“service started”);

var container = new WindsorContainer();
                container.Install(new GlobalInstaller());

var intervalStr = ConfigurationManager.AppSettings[“Interval”];
                int interval = 60;
                int t;
                if (int.TryParse(intervalStr, out t))
                {
                    interval = t;
                }

var period = interval * 60000;
                _timer = new Timer(timer_Elapsed);
                _timer.Change(2000, period);

int mandatoryInterval = 5;
                intervalStr = ConfigurationManager.AppSettings[“MandatoryInterval”];
                if (int.TryParse(intervalStr, out t))
                {
                    mandatoryInterval = t;
                }
                period = mandatoryInterval * 60000;
                _signTimer = new Timer(MandatorySignHandler);
                _signTimer.Change(2000, period);
            }
            catch (Exception ex)
            {
                Log.Error(“”, ex);
            }
        }

protected override void OnStop()
        {
            try
            {
                Log.Info(“service stopped”);
            }
            catch (Exception ex)
            {
                Log.Error(“”, ex);
            }
        }

void timer_Elapsed(object sender)
        {
            try
            {
                if (_timerRunning) return;
                _timerRunning = true;

var service = Service;
                if (service != null && PassRules())
                {
                    service.UpdateData();
                }
                _timerRunning = false;
            }
            catch (Exception ex)
            {
                Log.Error(“timer exception”, ex);
            }

}

void MandatorySignHandler(object sender)
        {
            const string title = “客户确认签收订单处理”;
            Log.Info(title + “begin”);
            try
            {
                var service = Service;
                if (service != null)
                {
                    service.UpdateMandatorySignedOrder();
                }
            }
            catch (Exception ex)
            {
                Log.Error(title, ex);
            }
            Log.Info(title + “end”);
        }

bool PassRules()
        {
            var now = DateTime.Now;
            int hour = now.Hour;
            if (hour >= 0 && hour <= 5
                || (hour >= 22 && hour <= 24)) return false;
            return true;
        }
    }

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,104
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,581
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,428
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,200
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,835
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,918