C#-Windows服務建立和運行

Windows服務建立和運行
 
 適用場景
ASP.Net一般是一個無狀態的提供程序,不支持持續運行代碼或者定時執行某段代碼,因此咱們須要構建本身的Windows服務來運行那些定時任務。
項目中須要定時處理數據時可使用服務,好比短信發送,郵件提醒,和其餘信息系統集合對接等定時任務
 
話很少說,簡單介紹如何建立
 
1.新建服務
從 Visual Studio「文件」菜單中,選擇「新建」 > 「項目」(或按 Ctrl+Shift+N),打開「新建項目」窗口
導航到並選擇「Windows 服務 (.NET Framework)」項目模板。 
 
2.更改服務名稱
右擊「屬性」,找到「ServiceName」屬性,修改爲「MyService」
 
3.添加安裝程序
(1)右擊「Service.cs[設計]」窗口,選擇「添加安裝程序」。
能夠看見項目中自動多了「serviceProcessInstall1」,"serviceInstaller1"這兩個文件。
 
(2) 設置組件serviceProcessInstaller1的主要屬性,Accout:帳戶類型,LocalSystem本地系統服務;
 
4.添加項目須要的業務代碼
 1 using System;  2 using System.Collections.Generic;  3 using System.Linq;  4 using System.ServiceProcess;  5 using System.Text;  6 using System.Threading.Tasks;  7 namespace WindowsService  8 {  9     static class Program 10  { 11         /// <summary>
12         /// 應用程序的主入口點。 13         /// </summary>
14         static void Main() 15  { 16  ServiceBase[] ServicesToRun; 17             ServicesToRun = new ServiceBase[] 18  { 19                 new Service1() 20  }; 21  ServiceBase.Run(ServicesToRun); 22  } 23  } 24 }

打開「Program.cs」,能夠看到服務啓動後,首先執行Service1。ide

這裏,咱們已5秒鐘一個輪詢,寫一條日誌信息爲例
(1)首先添加文件夾「Utils」,添加類「Common.cs」,用於記錄日誌
 1 using System;  2 using System.Collections.Generic;  3 using System.IO;  4 using System.Linq;  5 using System.Text;  6 using System.Threading.Tasks;  7 namespace WindowsService.Utils  8 {  9     public static class Common 10  { 11         public static void WriteLogs(string content) 12  { 13             string path = AppDomain.CurrentDomain.BaseDirectory; 14             string LogName =  System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Namespace.Split('.')[0]; 15             string[] sArray = path.Split(new string[] { LogName }, StringSplitOptions.RemoveEmptyEntries); 16             string aa = sArray[0] + "\\" + LogName + "Log\\"; 17             path = aa; 18             if (!string.IsNullOrEmpty(path)) 19  { 20                 if (!Directory.Exists(path)) 21  { 22  Directory.CreateDirectory(path); 23  } 24                 path = path + "\\" + DateTime.Now.ToString("yyyy-MM-dd") + ".txt";// 25                 if (!File.Exists(path)) 26  { 27                     FileStream fs = File.Create(path); 28  fs.Close(); 29  } 30                 if (File.Exists(path)) 31  { 32                     StreamWriter sw = new StreamWriter(path, true, System.Text.Encoding.Default); 33                     sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "----" +  content + "\r\n"); 34  sw.Close(); 35  } 36  } 37  } 38  } 39 }

 

 
(2)建立業務代碼類「HandleService.cs」
 1 using System;  2 using System.Collections.Generic;  3 using System.Linq;  4 using System.Text;  5 using System.Threading.Tasks;  6 using WindowsService.Utils;  7 namespace WindowsService  8 {  9     public class HandleService 10  { 11         public static void ActionRun(ref bool isRun) 12  { 13             try { 14                 isRun = true; 15                 //業務代碼
16                 Common.WriteLogs("這是一條日誌"); 17               
18  } 19             catch (Exception ex) 20  { 21  Common.WriteLogs(ex.Message); 22  } 23             finally
24  { 25                 isRun = false; 26  } 27  } 28  } 29 }

 

(3)設置Service1的定時觸發功能,
須要添加定時器Timer,定時執行上一步建立的「HandleService.cs」中的業務邏輯,完整代碼以下
 1 using System;  2 using System.Collections.Generic;  3 using System.ComponentModel;  4 using System.Data;  5 using System.Diagnostics;  6 using System.Linq;  7 using System.ServiceProcess;  8 using System.Text;  9 using System.Threading.Tasks; 10 using WindowsService.Utils; 11 namespace WindowsService 12 { 13     public partial class Service1 : ServiceBase 14  { 15         public Service1() 16  { 17  InitializeComponent(); 18  } 19         System.Timers.Timer _timer = new System.Timers.Timer(); 20         private bool isRun = false; 21         protected override void OnStart(string[] args) 22  { 23             try
24  { 25                 int _interval = 5 * 1000; 26                 _timer.Interval = _interval; 27                 _timer.AutoReset = true; 28                 _timer.Enabled = true; 29                 _timer.Elapsed += new System.Timers.ElapsedEventHandler(ActionRun); 30                 Common.WriteLogs("服務已啓動"); 31  } 32             catch (Exception ex) 33  { 34  Common.WriteLogs(ex.Message); 35  } 36  } 37         private void ActionRun(object sender, System.Timers.ElapsedEventArgs e) 38  { 39             try
40  { 41                 if (!isRun) 42  { 43                     HandleService.ActionRun(ref isRun); 44  } 45  } 46             catch (Exception ex) 47  { 48                 Common.WriteLogs("Error:" + ex.Message); 49  } 50  } 51         protected override void OnStop() 52  { 53             _timer.AutoReset = false; 54             _timer.Enabled = false; 55  _timer.Stop(); 56             Common.WriteLogs("服務已中止"); 57  } 58  } 59 } 60

生成項目文件,所有生成成功後,就要開始服務的安裝和啓動spa

5.服務的安裝和啓動
項目成功後,在bin文件夾下找到生成的exe文件和exe.config文件,前者是運行程序,後者是服務的配置信息,實際項目中能夠經過更改config中的內容,修改服務的配置信息。
安裝和卸載主要使用的是.NET提供的InstallUtil.exe這個文件 ,文件位於C盤對應的目錄下 C:\Windows\ Microsoft.NET\Framework64\v4.0.30319,拷貝至和exe同一個目錄bin下。
 
新建bat文件,用於安裝,啓動,卸載,中止,重啓服務
 
1 安裝.bat: 2 sc create MyWinService binPath= "%~dp0WindowsService.exe" start= auto 3 net start MyWinService 4 pause 5

 

1 啓動.bat 2 net start MyWinService 3 pause 4

 

1 中止.bat 2 net stop MyWinService 3 pause

 

1 卸載.bat 2 net stop MyWinService 3 sc delete MyWinService binPath= "%~dp0JDWindowsService.exe" start= auto 4 pause

 

1 重啓.bat 2 net stop MyWinService 3 net start MyWinService 4 pause

 

6.運行安裝文件和啓動服務
雙擊「安裝.bat」,彈出cmd窗口,以下圖,表示安裝成功:
 
雙擊「啓動.bat」,以下圖表示成功啓動服務
 
 
7.查看業務代碼的日誌寫入是否成功
找到項目文件同一個目錄下的Log文件,找到日誌,以下圖所示:
 
能夠看到日誌文件每隔5秒會寫入一條日誌文件,至此整個服務運行成功。
 
本文源碼下載:
提取碼:a62m
相關文章
相關標籤/搜索