在日常開發中,有時候需要將我們的程式隨著操作系統一起運行,並且無需人工干預。要實現這種效果,有很多種方法,比如:如果是桌面程式,可以設置到程式的啟動項;如果是Web程式,還可以托管到IIS中,而對於控制台程式,最常見在做法是將程式部署成Windows服務,並設置成自動運行,這樣當操作系統開機時,就會... ...
在日常開發中,有時候需要將我們的程式隨著操作系統一起運行,並且無需人工干預。要實現這種效果,有很多種方法,比如:如果是桌面程式,可以設置到程式的啟動項;如果是Web程式,還可以托管到IIS中,而對於控制台程式,最常見在做法是將程式部署成Windows服務,並設置成自動運行,這樣當操作系統開機時,就會自動啟動。在.NET程式中,如何將控制台程式,部署成Windows服務中呢?本文以一個簡單的小例,簡述如何利用一款第三方插件(Topshelf)將控制台程式部署成Windows服務的相關方法及步驟。
什麼是Topshelf?
Topshelf是一款開源的用於托管.NET編寫的應用程式到Windows服務的框架,通過Topshelf,可以非常方便的將普通控制台應用程式,轉換成Winodw服務,並註冊到Windows服務控制管理器(SCM)中。
示例說明
Windows服務一般都是周期性重覆運行的,並不會停止。在本示例中,主要是為了演示創建Windows服務的方法及功能框架,實現功能是每隔一秒鐘,輸入一段話到日誌文件中,以便於查看。
創建控制台應用程式
首先創建一個控制台應用程式,以及一個普通的類(AppService),此類包含Start和Stop方法,以及Work方法,具備一個服務的基本功能。如下所示:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DemoWinService
{
/// <summary>
/// 程式運行主體
/// </summary>
internal class AppService
{
private CancellationTokenSource cts;
private CancellationToken token;
private Task bgtask;
public AppService()
{
this.cts = new CancellationTokenSource();
this.token = cts.Token;
}
/// <summary>
/// 開始
/// </summary>
public void Start()
{
Logger.Info("DemoWinService程式開始運行");
this.bgtask = Task.Run(() =>
{
while (!this.token.IsCancellationRequested)
{
try
{
this.Work();
}
catch (Exception ex)
{
}
finally
{
Sleep(1000);
}
}
});
}
/// <summary>
/// 運行
/// </summary>
public void Work()
{
Logger.Info($"{DateTime.Now.ToString("當前時間為:yyyy-MM-dd HH:mm:ss")}程式正在運行...");
}
/// <summary>
/// 停止
/// </summary>
public void Stop()
{
cts.Cancel();
if(this.bgtask != null)
{
this.bgtask.Wait(1000);
}
Logger.Info("DemoWinService程式結束運行");
}
/// <summary>
/// 線程等待
/// </summary>
/// <param name="milliseconds"></param>
private void Sleep(int milliseconds)
{
int times = 10;
if (milliseconds <= 1000)
{
times = 10;
}
else if (milliseconds > 1000 && milliseconds <= 10000)
{
times = 20;
}
else if (milliseconds > 10000 && milliseconds <= 100000)
{
times = 40;
}
else
{
times = 60;
}
for (int i = 0; i < times; i++)
{
if (token.IsCancellationRequested)
{
return;
}
Thread.Sleep(milliseconds / times);
}
}
}
}
安裝Topshelf組件
在Visual Studio開發工具中,可以通過Nuget包管理器進行安裝,如下所示:
配置註冊Windows服務
在Program的Main方法中,通過HostFactory的Run方法,註冊Windows服務,如下所示:
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Topshelf;
namespace DemoWinService
{
internal class Program
{
public static void Main(string[] args)
{
var rc = HostFactory.Run(x =>
{
x.Service<AppService>(s =>
{
s.ConstructUsing(name => new AppService());
s.WhenStarted(tc => tc.Start());
s.WhenStopped(tc => tc.Stop());
});
x.RunAsLocalSystem();
x.StartAutomatically();
x.SetDescription(ConfigurationManager.AppSettings["Description"]);
x.SetDisplayName(ConfigurationManager.AppSettings["DisplayName"]);
x.SetServiceName(ConfigurationManager.AppSettings["ServiceName"]);
});
var exitCode = (int)Convert.ChangeType(rc, rc.GetTypeCode());
Environment.ExitCode = exitCode;
}
}
}
其中服務名稱和描述信息,在配置文件(App.config)中,方便修改。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="Description" value="測試Windows服務"/>
<add key="ServiceName" value="DemoWinService"/>
<add key="DisplayName" value="DemoWinService"/>
</appSettings>
</configuration>
服務安裝
當程式開發完成後,將編譯後的程式放置在伺服器上指定的目錄,然後【以管理員運行】打開命令行視窗,找到程式目錄,通過以下命令進行安裝:
可執行程式.exe install
示例如下所示:
啟動停止服務
安裝成功後,即可在Windows服務管理器中,進行啟動或者停止 ,如下所示:
程式輸出日誌,表示服務正常運行:
服務卸載
當服務不再使用時,可以通過如下命令卸載服務:
可執行程式.exe uninstall
示例如下所示:
Topshelf源碼
GitHub源碼:https://github.com/Topshelf/Topshelf
以上就是【推薦一款將控制台程式部署到Windows服務的組件】的全部內容,希望可以拋磚引玉,一起學習,共同進步。
作者:老碼識途
出處:http://www.cnblogs.com/hsiang/
本文版權歸作者和博客園共有,寫文不易,支持原創,歡迎轉載【點贊】,轉載請保留此段聲明,且在文章頁面明顯位置給出原文連接,謝謝。
關註個人公眾號,定時同步更新技術及職場文章