對於使用Windows操作系統的人來說,Windows Service(Windows服務)應該不會陌生。在Windows操作系統中,我們可以在”運行”視窗中運行service.msc,即可打開一個查看Windows服務的視窗。Windows服務基本都是一些後臺運行的服務進程,沒有UI界面,每個服務... ...
本文首發於:碼友網--一個專註.NET/.NET Core開發的編程愛好者社區。
文章目錄
C#/.NET基於Topshelf創建Windows服務的系列文章目錄:
- C#/.NET基於Topshelf創建Windows服務程式及服務的安裝和卸載 (1)
- 在C#/.NET應用程式開發中創建一個基於Topshelf的應用程式守護進程(服務) (2)
- C#/.NET基於Topshelf創建Windows服務的守護程式作為服務啟動的客戶端桌面程式不顯示UI界面的問題分析和解決方案 (3)
前言
對於使用Windows操作系統的人來說,Windows Service(Windows服務)應該不會陌生。在Windows操作系統中,我們可以在"運行"視窗中運行service.msc
:
即可打開一個查看Windows服務的視窗,如圖:
Windows服務基本都是一些後臺運行的服務進程,沒有UI界面,每個服務處理著各自獨立的任務並且有專門的啟動或者停止策略。所以,Windows服務在很多情況下會被用來者處理一些定時任務或者調度。
那麼,對於.NET的開發者來說,可不可以自己創建Windows服務呢,如何使用C#創建Windows服務呢?
本文就為大家分享一種基於Topshelf創建的Windows服務的方法。
創建Topshelf服務項目
首先打開Visual Studio(本文使用的是Visual Studio 2019),打開新建項目的對話框,選擇.NET Framework的控制台應用程式(Console App(.NET Framework)),如圖:
註:只可選擇控制台應用程式
點擊"下一步",在項目名稱中輸入TopshelfDemoService
,.NET Framework 選擇4.6.2,其中選項根據自己情況填寫即可,最後點擊"創建"按鈕。
安裝Topshelf組件
在TopshelfDemoService
項目中,打開Nuget包管理工具,搜索Topshelf
,在搜索結果中選中Topshelf
,點擊"安裝",如圖:
編寫Topshelf服務的示常式序代碼
Topshelf
組件安裝完成後,我們就可以開始編寫服務的示例代碼了。
首先,創建一個名為HealthMonitorService.cs
的類(其作用假設為定時監控某個系統的運行健康狀況),在其中分別創建方法:Start()
和Stop()
以及一個定時器,讓定時器定時執行檢查系統健康狀況的任務(這裡模擬的每秒向控制台輸出一條文本信息),完整的代碼如下:
using System;
using System.Timers;
namespace TopshelfDemoService
{
internal class HealthMonitorService
{
private readonly Timer _timer;
public HealthMonitorService()
{
_timer = new Timer(1000) { AutoReset = true };
_timer.Elapsed += (sender, eventArgs) => Console.WriteLine("執行系統健康檢查任務,所有指標均正常。執行時間:{0}", DateTime.Now);
}
public void Start()
{
_timer.Start();
}
public void Stop()
{
_timer.Stop();
}
}
}
再創建一個名為MyServiceConfigure.cs
的服務配置類,這個類主要用來配置Topshelf服務的各種運行參數,代碼如下:
using System;
using Topshelf;
namespace TopshelfDemoService
{
internal class MyServiceConfigure
{
internal static void Configure()
{
var rc = HostFactory.Run(host => // 1
{
host.Service<HealthMonitorService>(service => // 2
{
service.ConstructUsing(() => new HealthMonitorService()); // 3
service.WhenStarted(s => s.Start()); // 4
service.WhenStopped(s => s.Stop()); // 5
});
host.RunAsLocalSystem(); // 6
host.EnableServiceRecovery(service => // 7
{
service.RestartService(3); // 8
});
host.SetDescription("Windows service based on topshelf"); // 9
host.SetDisplayName("Topshelf demo service"); // 10
host.SetServiceName("TopshelfDemoService"); // 11
host.StartAutomaticallyDelayed(); // 12
});
var exitCode = (int)Convert.ChangeType(rc, rc.GetTypeCode()); // 13
Environment.ExitCode = exitCode;
}
}
}
註:其中數字的含義請見本文末尾的解釋。
最後,打開Program.cs
文件,開啟Topshelf
服務,如下:
namespace TopshelfDemoService
{
class Program
{
static void Main(string[] args)
{
MyServiceConfigure.Configure();
}
}
}
好了,完成到這裡,整個示常式序就寫好了,按F5運行示常式序,你將看到如下類似的控制台信息:
可以看到,我們創建的TopshelfDemoService
服務每秒向控制台列印了一條文本信息,這和我們的預期是吻合的。
這樣,我們就成功創建了一個基於Topshelf
的Windows服務,當然,這也只是一個簡單和示例服務程式,其中沒有複雜的業務邏輯和配置等等。這些都等待你去發掘。
作為Windows服務安裝和卸載
我們剛纔運行的只是一個控制台應用程式,如果將這個控制台應用程式關掉,定時任務也會被停止了。如果我們希望定時任務可以一直運行,那需要將這個控制台應用程式作為服務安裝到Windows服務進程中,如何操作呢?
非常簡單的安裝和卸載命令。
首先,以管理員身份打開一個命令行工具,進入到控制台應用程式所在目錄。
安裝
安裝服務運行如下命令:
TopshelfDemoService.exe install
打開Windows服務查看視窗(刷新),可以看到Topshelf demo service
已經在服務列表中了,如圖:
這時,我們只需要按照Windows服務來操作這個服務即可。
卸載
如果需要卸載服務,則運行如下命令:
TopshelfDemoService.exe uninstall
Topshelf配置參數說明
1.設置服務主機使用
HostFactory.Run()
來創建並運行一個Topshelft服務。
2.設置Topshelf
使用類型HealthMonitorService
作為服務類。
3.配置如何創建一個服務的實例,這裡採用的是使用關鍵字new
來實例化一個HealthMonitorService
對象,你也可以使用IoCp容器來實例化服務對象。
4.設置當服務啟動時執行的操作。
5.設置當服務停止時執行的操作。
6.設置將服務以本地系統身份運行。
7.啟動恢復服務模式(當服務意外停止後自動恢復)。
8.設置第一次自動恢復服務的延遲時間為3分鐘。
9.設置Topshelf服務在Windows服務中的描述信息。
10.設置Topshelf服務在Windows服務中的顯示名稱。
11.設置Topshelf服務在Windows服務中的服務名稱。
12.設置Topshelf服務隨Windows啟動時自動運行(延遲)。
13.設置服務的退出代碼。
示例代碼托管和下載
本示例代碼托管地址可以在原出處找到:示例代碼下載地址