最近在做一個物聯網項目,其中有一個模塊是需要實現熱水工程的自動化補水和回水功能
實現的方式有多種,我選用了VS C#的Windows服務方式。
首先是創建一個windows服務項目(名稱隨你喜歡的規范命名,我這里就用默認的Service1)
VS自動為我們生成了一個什么都不干的空服務框架,雖然什么都不干,但是生成項目,安裝進服務管理中,也是能啟動和停止的。
麻省雖小,五臟俱全。
那么,一個能用的服務就產生了。我們要做的就是做修改和增加功能。
先來看看VS生成的服務框架都有哪些內容吧,了解了這些自然就懂得服務進程的開發了。PSp:)
首先來看看項目列表目錄:有五項:
1).Properties :
2).引用:
3).App.config:
這三項不用說了,太熟悉不過了。與WinForm一樣一樣的。
4).Program.cs:
這個也很熟悉了吧,進程入口。
static class Program
{
/// <summary>
/// 應用程序的主入口點。
/// </summary>
static void Main()
{
ServiceBase[] ServicesToRun; //看到沒,這里定義的是一個數組。我們先不管ServiceBase是干什么的,看到Base應該想到是一個基類了。
ServicesToRun = new ServiceBase[]
{
new Service1() //這里只初始化了一個服務,那么我們就可以想得到,可以增加多個在這里。Service1是繼承自 ServiceBase,這里其實就是協變的應用,也可以用里氏轉換來理解。
};
ServiceBase.Run(ServicesToRun);//Run方法與WinForm里的 Run,控制台程序中的main是一個意思了。數組ServicesToRun里放了多少個都會啟動。
}
}
5).Service1.cs:
這個才是我們這個服務進程的核心所在。包含了一個設計器和代碼。
在設計器頁面,點擊右鍵選擇屬性或直接按F4,打開Service1這個類的屬性窗口。我們可以看到:
Name:不用多說,自然是這個服務類的類名了,改成你自己的。
ServiceName:服務進程的名字。windows操作系統維護服務進程時最喜歡這個屬性了。PS:)
AutoLog:默認為True,就是是不是設置為windows日志記錄的意思。
CanStop:字面含義就是能夠停止,也不能理解,設為True,可以在服務器管理中或net stop命令能讓它停止。
CanShutdown:能夠關機,意思就是在系統將要關機的時候,能接收系統發送過來的通知,可以做一些相應的處理。
這里是幾個常用的屬性了。其它的就不多說了。
現在我們來看一下代碼部分:
//VS 默認寫好了的代碼:
public partial class Service1 : ServiceBase //沒錯吧,Service1就是繼承自ServiceBase的
{
//Timer time;//定時器
public Service1()
{
InitializeComponent();
//Todo:初始化一些字段值屬性值等,如:
//time.Interval=1000;
//time.Elapsed += time_Elapsed;
}
protected override void OnStart(string[] args)
{
//這個方法就是服務在啟動后執行的第一個方法。可以理解為一個類的實例的構造方法。
//服務啟動好后,你想要這個服務干些什么事,入口就在這里了。
File.AppendAllText("C:\Log.txt","服務已啟動");
}
protected override void OnStop()
{
//這里看名字也知道這是服務將要停止的時候執行的方法。像window的OnClose這么理解就對了。
File.AppendAllText("C:\Log.txt","服務已停止");
}
//這兩個方法是最基本需求的方法。還有幾個常用的如:
//OnShutdown(),//該方法指定應在系統即將關閉前執行的處理
//OnPause(),//指定要在服務暫停時采取的操作。
//OnContinue()//指定要在服務暫停后恢復正常功能時采取的操作。
//這些都是基類定義好的抽象方法,要在子類中實現的。所以在實現時要記得加上override。
}
關於服務進程的開發,理解了這些也就不難開發了。其它的功能就像開發WinForm和控制台程序一樣的開發就完事。
但是這時候生成的服務進程的exe是不能直接運行的,需要安裝到系統的服務器控制平台中才能啟動運行。
VS也進供了方法。
只需要在Service1.cs的設計界面,右鍵選擇添加安裝程序,會自動幫我們生成安裝程序:ProjectInstaller.cs,連引用都做好了。真貼心啊。PS:)
然后要做的就是重新生成項目。
然后在VS的工具中打開本機工具命令提示。
執行:installutil [你生成的服務進程的完整路徑]
O了。去服務管理控制器中體驗自己開發的服務器:)
刪除服務使用:installutil -u [你生成的服務進程的完整路徑]