翼度科技»论坛 编程开发 .net 查看内容

推荐一款将控制台程序部署到Windows服务的组件

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
在日常开发中,有时候需要将我们的程序随着操作系统一起运行,并且无需人工干预。要实现这种效果,有很多种方法,比如:如果是桌面程序,可以设置到程序的启动项;如果是Web程序,还可以托管到IIS中,而对于控制台程序,最常见在做法是将程序部署成Windows服务,并设置成自动运行,这样当操作系统开机时,就会自动启动。在.NET程序中,如何将控制台程序,部署成Windows服务中呢?本文以一个简单的小例,简述如何利用一款第三方插件(Topshelf)将控制台程序部署成Windows服务的相关方法及步骤。
 
什么是Topshelf?

 
Topshelf是一款开源的用于托管.NET编写的应用程序到Windows服务的框架,通过Topshelf,可以非常方便的将普通控制台应用程序,转换成Winodw服务,并注册到Windows服务控制管理器(SCM)中。
 
示例说明

 
Windows服务一般都是周期性重复运行的,并不会停止。在本示例中,主要是为了演示创建Windows服务的方法及功能框架,实现功能是每隔一秒钟,输入一段话到日志文件中,以便于查看。
 
创建控制台应用程序

 
首先创建一个控制台应用程序,以及一个普通的类(AppService),此类包含Start和Stop方法,以及Work方法,具备一个服务的基本功能。如下所示:
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace DemoWinService
  7. {
  8.     /// <summary>
  9.     /// 程序运行主体
  10.     /// </summary>
  11.     internal class AppService
  12.     {
  13.         private CancellationTokenSource cts;
  14.         private CancellationToken token;
  15.         private Task bgtask;
  16.         public AppService()
  17.         {
  18.             this.cts = new CancellationTokenSource();
  19.             this.token = cts.Token;
  20.         }
  21.         /// <summary>
  22.         /// 开始
  23.         /// </summary>
  24.         public void Start()
  25.         {
  26.             Logger.Info("DemoWinService程序开始运行");
  27.             this.bgtask = Task.Run(() =>
  28.             {
  29.                 while (!this.token.IsCancellationRequested)
  30.                 {
  31.                     try
  32.                     {
  33.                         this.Work();
  34.                     }
  35.                     catch (Exception ex)
  36.                     {
  37.                     }
  38.                     finally
  39.                     {
  40.                         Sleep(1000);
  41.                     }
  42.                 }
  43.             });
  44.         }
  45.         /// <summary>
  46.         /// 运行
  47.         /// </summary>
  48.         public void Work()
  49.         {
  50.             Logger.Info($"{DateTime.Now.ToString("当前时间为:yyyy-MM-dd HH:mm:ss")}程序正在运行...");
  51.         }
  52.         /// <summary>
  53.         /// 停止
  54.         /// </summary>
  55.         public void Stop()
  56.         {
  57.             cts.Cancel();
  58.             if(this.bgtask != null)
  59.             {
  60.                 this.bgtask.Wait(1000);
  61.             }
  62.             Logger.Info("DemoWinService程序结束运行");
  63.         }
  64.         /// <summary>
  65.         /// 线程等待
  66.         /// </summary>
  67.         /// <param name="milliseconds"></param>
  68.         private void Sleep(int milliseconds)
  69.         {
  70.             int times = 10;
  71.             if (milliseconds <= 1000)
  72.             {
  73.                 times = 10;
  74.             }
  75.             else if (milliseconds > 1000 && milliseconds <= 10000)
  76.             {
  77.                 times = 20;
  78.             }
  79.             else if (milliseconds > 10000 && milliseconds <= 100000)
  80.             {
  81.                 times = 40;
  82.             }
  83.             else
  84.             {
  85.                 times = 60;
  86.             }
  87.             for (int i = 0; i < times; i++)
  88.             {
  89.                 if (token.IsCancellationRequested)
  90.                 {
  91.                     return;
  92.                 }
  93.                 Thread.Sleep(milliseconds / times);
  94.             }
  95.         }
  96.     }
  97. }
复制代码
 其中服务名称和描述信息,在配置文件(App.config)中,方便修改。
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Configuration;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using Topshelf;
  8. namespace DemoWinService
  9. {
  10.     internal class Program
  11.     {
  12.         public static void Main(string[] args)
  13.         {
  14.             var rc = HostFactory.Run(x =>
  15.             {
  16.                 x.Service<AppService>(s =>
  17.                 {
  18.                     s.ConstructUsing(name => new AppService());
  19.                     s.WhenStarted(tc => tc.Start());
  20.                     s.WhenStopped(tc => tc.Stop());
  21.                 });
  22.                 x.RunAsLocalSystem();
  23.                 x.StartAutomatically();
  24.                 x.SetDescription(ConfigurationManager.AppSettings["Description"]);
  25.                 x.SetDisplayName(ConfigurationManager.AppSettings["DisplayName"]);
  26.                 x.SetServiceName(ConfigurationManager.AppSettings["ServiceName"]);
  27.             });
  28.             var exitCode = (int)Convert.ChangeType(rc, rc.GetTypeCode());
  29.             Environment.ExitCode = exitCode;
  30.         }
  31.     }
  32. }
复制代码
 
服务安装

 
当程序开发完成后,将编译后的程序放置在服务器上指定的目录,然后【以管理员运行】打开命令行窗口,找到程序目录,通过以下命令进行安装:
  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <configuration>
  3.         <appSettings>
  4.                 <add key="Description" value="测试Windows服务"/>
  5.                 <add key="ServiceName" value="DemoWinService"/>
  6.                 <add key="DisplayName" value="DemoWinService"/>
  7.         </appSettings>
  8. </configuration>
复制代码
 示例如下所示:

 
启动停止服务

 
安装成功后,即可在Windows服务管理器中,进行启动或者停止 ,如下所示:
 

 
程序输出日志,表示服务正常运行:
 

 
服务卸载

 
当服务不再使用时,可以通过如下命令卸载服务:
  1. 可执行程序.exe install
复制代码
 
示例如下所示:

 
Topshelf源码

 
Topshelf是一款开源框架,其源码是托管到Github中,如下所示:GitHub源码:https://github.com/Topshelf/Topshelf

 
以上就是【推荐一款将控制台程序部署到Windows服务的组件】的全部内容,希望可以抛砖引玉,一起学习,共同进步。

来源:https://www.cnblogs.com/hsiang/p/18317307
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具