Windows服務二:測試新建的服務、調試Windows服務

一、測試Windows服務

為了使Windows服務程序能夠正常運行,我們需要像創建一般應用程序那樣為它創建一個程序的入口點。像其他應用程序一樣,Windows服務也是在Program.cs的Main()函數中完成這個操作。首先我們在Main()函數中創建一個Windows服務的實例,該實例應該是ServiceBase類的某個子類的對象,然后我們調用由基類ServiceBase類定義的一個Run()方法。然而調用Run()方法并不意味著就開始了Windows服務程序,必須要等到該對象的OnStart()方法被調用時服務才算真正開始運行。如果你想在一個Windows服務程序中同時啟動多個服務,那么只要在Main()函數中定義多個ServiceBase類的子類的實例對象就可以了,方法就是創建一個ServiceBase類的數組對象。

 1 namespace WindowsServiceDemo
 2 {
 3     static class Program
 4     {
 5         /// <summary>
 6         /// 應用程序的主入口點。
 7         /// </summary>
 8         static void Main()
 9         {
10             ServiceBase[] ServicesToRun;
11             ServicesToRun = new ServiceBase[] 
12             { 
13                 //服務1
14                 new MyService(), 
15                 //服務2
16                 new Service1()
17             };
18             ServiceBase.Run(ServicesToRun);
19         }
20     }
21 }

由于Windows服務沒有直接的用戶交互,服務的狀態必須通過記錄日志才可知曉。要測試windows服務,可以通過重寫服務里面的方法,在方法里面記錄日志來實現。

1、新建Common類,類里面有一個WriteLog記錄日志的方法。日志路徑寫在配置文件里面,可以實現項目的靈活性。

 1 namespace WindowsServiceDemo
 2 {
 3     public class Common
 4     {
 5         /// <summary>
 6         /// 記錄日志
 7         /// </summary>
 8         /// <param name="strInfo"></param>
 9         public static void WriteLog(string strInfo)
10         {
11             string strPath=ConfigurationManager.AppSettings["FilePath"];
12             using (StreamWriter sw = new StreamWriter(strPath, true))
13             {
14                 sw.WriteLine(strInfo + ",當前時間:" + DateTime.Now.ToString());
15                 sw.Close();
16             }
17             
18         }
19     }
20 }
View Code

2、在Service1的設計界面點右鍵-->查看代碼,打開Service1的代碼,分別重寫OnStart()、OnStop()、OnPause()、OnContinue()方法,在方法里面調用Common類的WriteLog方法來記錄服務的運行狀態。

 1 namespace WindowsServiceDemo
 2 {
 3     public partial class MyService : ServiceBase
 4     {
 5         public MyService()
 6         {
 7             InitializeComponent();
 8         }
 9 
10         /// <summary>
11         /// 服務啟動時執行的代碼
12         /// </summary>
13         /// <param name="args"></param>
14         protected override void OnStart(string[] args)
15         {
16             try
17             {
18                 Common.WriteLog("服務啟動");
19             }
20             catch (Exception ex)
21             {
22                 Common.WriteLog("服務啟動出錯:"+ex.Message);
23             }
24         }
25 
26         /// <summary>
27         /// 服務停止時執行的代碼
28         /// </summary>
29         protected override void OnStop()
30         {
31             try
32             {
33                 Common.WriteLog("服務停止");
34             }
35             catch (Exception ex)
36             {
37                 
38                 Common.WriteLog("服務停止出錯:"+ex.Message);
39             }
40         }
41 
42         /// <summary>
43         /// 服務暫停時執行的代碼
44         /// </summary>
45         protected override void OnPause()
46         {
47             try
48             {
49                 Common.WriteLog("服務暫停");
50             }
51             catch (Exception ex)
52             {
53                 
54                  Common.WriteLog("服務暫停出錯:"+ex.Message);
55             }
56         }
57 
58         /// <summary>
59         /// 服務恢復時執行的代碼
60         /// </summary>
61         protected override void OnContinue()
62         {
63             try
64             {
65                 Common.WriteLog("服務恢復");
66             }
67             catch (Exception ex)
68             {
69                 
70                  Common.WriteLog("服務恢復出錯:"+ex.Message);
71             }
72         }
73 
74     }
75 }

3、在服務控制管理器里面分別啟動、暫停、恢復、停止服務,查看生成的日志:

日志里面正確記錄了服務的運行狀態,證明服務沒有問題。

二、調試Windows服務

?調試Windows服務,可以采用將服務附加到進程的方法。

1、在菜單欄選項里面選擇調試-->附加到進程

2、在附加到進程界面,選擇相應的服務進程,點擊附加。
注意:要把服務附加到進程,必須保證服務是啟動狀態,否則在進程里面看不到服務的進程。

三、總結:
1、Windows服務調試不能直接F5,可以通過附加到進程方式調試(調試前提:將服務啟動、以管理員身份運行VS)
2、Windows服務由于沒有直接的用戶交互,服務的狀態必須通過日志才可知曉,恰當的加入try catch
3、所有可能發生變化的內容都不要寫死,盡量通過配置文件來實現,這是項目靈活性的重要指標
4、Windows服務多用于定時操作、大數據量操作、監控操作等方面

?

轉載于:https://www.cnblogs.com/dotnet261010/p/6180801.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/285184.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/285184.shtml
英文地址,請注明出處:http://en.pswp.cn/news/285184.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

角度前方交會點坐標計算完整步驟

測量工作中&#xff0c;我們常常會遇到待測點被障礙物遮擋住觀測視線而無法進行觀測的情況。這時候我們就需要特殊的交會計算方法對待定點進行特別的觀測。 前方交會又稱為測角交會&#xff0c;是指從相鄰兩個已知點向待定點觀測兩個水平角&#xff0c;用以計算待定點的坐標。 …

Mysql 的子查詢

子查詢&#xff1a; 子查詢&#xff1a;嵌套在其它查詢中的查詢語句。&#xff08;又稱為內部查詢&#xff09; 主查詢&#xff1a;包含其它子查詢的查詢稱為主查詢。&#xff08;又稱外部查詢&#xff09; 非相關子查詢&#xff1a; 在主查詢中&#xff0c;子查詢只需要執行一…

【系統設計】指標監控和告警系統

在本文中&#xff0c;我們將探討如何設計一個可擴展的指標監控和告警系統。一個好的監控和告警系統&#xff0c;對基礎設施的可觀察性&#xff0c;高可用性&#xff0c;可靠性方面發揮著關鍵作用。下圖顯示了市面上一些流行的指標監控和告警服務。接下來&#xff0c;我們會設計…

C語言試題154之兩個字符串連接程序

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款模擬面試、刷題神器?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目:兩個字符串連接程序 2 、溫馨…

[轉]Android studio 快速解決Gradle's dependency cache may be corrupt 和 Gradle配置 gradle

用了好久的AS了&#xff0c;官方版本更新&#xff0c;各種配置工具 也跟著更新。更新后導入工程時&#xff08;使用Android工程編譯或者導入新的工程沒有對應的gradle版本&#xff09;一些電腦出現一下問題。 Error:Failed to open zip file. Gradles dependency cache may …

mybatis源碼學習

2019獨角獸企業重金招聘Python工程師標準>>> 學習主線&#xff1a; 目的&#xff1a;mybatis的作用orm框架&#xff0c;用了該框架就不用自己調用jdbc了。 用法&#xff1a;。。。。。 邏輯&#xff1a;。。。。。 源代碼&#xff1a;。。。。。 1、猜想mybatis對數…

自己封裝一個彈框插件

彈出層提示信息&#xff0c;這是移動前端開發中最常見的需求&#xff0c;你可能會想到一些流行的彈框插件&#xff0c;比如 經典的artDialog 炫酷的Sweetalert等等.. 但是慢慢地你其實會發現通常情況下需求定制化要求較高&#xff0c;一般的彈框插件可能只滿足大部分要求&#…

C語言中include““與include<>的區別(自定義頭文件、預設頭文件)

文章目錄 新建控制臺應用程序自定義頭文件編輯頭文件工程內引用頭文件,調用函數標準庫頭文件,調用函數新建控制臺應用程序 Win32 Application和Win32 Console Application 都是工作在32位Windows環境的程序。其中: (1)Win32 Application就是普通的常見的窗口應用程序,當…

.NET MAUI 性能提升

點擊藍字關注我們作者&#xff1a;Jonathan Peppers翻譯&#xff1a;Yijing Sun校稿&#xff1a;Amy Peng排版&#xff1a;Rani Sun精彩預告*本文干貨滿滿&#xff0c;預計閱讀時間32分鐘&#xff0c;建議收藏保存。.NET多平臺應用程序UI (MAUI)將android、iOS、macOS和Windows…

類與類之間的關系

橫向關系依賴 關聯 聚合 組合 判斷方法&#xff1a; 生命周期有關系&#xff1a;組合&#xff0c;聚合  聚合&#xff1a;包含多個相同的類  組合&#xff1a;定義的時候就要有  依賴&#xff1a;只要使用就必須要有  關聯&#xff1a;可有可無 縱向關系繼承 基類( 父類…

C語言試題155之有五個學生,每個學生有 3 門課的成績,從鍵盤輸入以上數據(包括學生號,姓名,三門課成績),計算出 平均成績,況原有的數據和計算出的平均分數存放在磁盤文件“stud“中

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款模擬面試、刷題神器?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目:有五個學生,每個學生有 3 門…

仿照支付寶賬單界面--listview分組顯示 用來做!發!財樹充值交易明細

QQ圖片20150430155638.png (151.65 KB, 下載次數: 32) 下載鏈接: http://pan.baidu.com/s/1kVMY1SV 密碼: i8ta

系統中常用的目錄

Linux系統中常用的目錄 目錄 /bin 存放二進制可執行文件(ls,cat,mkdir等)&#xff0c;常用命令一般都在這里。 /etc 存放系統管理和配置文件 /home 存放所有用戶文件的根目錄&#xff0c;是用戶主目錄的基點&#xff0c;比如用戶user的主目錄就是/home/user&#xff0…

C語言試題156之有兩個磁盤文件 A 和 B,各存放一行字母,要求把這兩個文件中的信息合并(按字母順序排列), 輸出到一個新文件 C 中。

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款模擬面試、刷題神器?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目:有兩個磁盤文件 A 和 B,各存…

【ArcGIS微課1000例】0002:創建漁網(Create fishnet)

本文講解ArcGIS軟件中漁網(fishnet)工具的原理,方法及使用技巧。 文章目錄 微課目標工具介紹實現過程微課目標 如下圖所示,影像為無人機航測生產的DOM,現在需要在ArcGIS平臺中進行DLG數據采集(數字化),由于測區較大,需要創建500*500的漁網,并對影像進行裁剪下發給多…

基于http協議的api接口對于客戶端的身份認證方式以及安全措施[轉]

基于http協議的api接口對于客戶端的身份認證方式以及安全措施 由于http是無狀態的&#xff0c;所以正常情況下在瀏覽器瀏覽網頁&#xff0c;服務器都是通過訪問者的cookie(cookie中存儲的jsessionid)來辨別客戶端的身份的&#xff0c;當客戶端進行登錄服務器也會將登錄信息存放…

使用 Scrutor 快速實現“裝飾者模式”

裝飾者模式介紹裝飾器模式&#xff08;Decorator Pattern&#xff09;是在不改變原類和使用繼承的情況下&#xff0c;動態地給一個對象添加一些額外的職責。它是通過創建一個包裝對象&#xff0c;也就是裝飾來包裹真實的對象。可以在如下使用場景中使用裝飾器模式&#xff1a;在…

各個 Android Gradle 插件版本所需的 Gradle 版本

下表列出了各個 Android Gradle 插件版本所需的 Gradle 版本。 要獲得最佳性能&#xff0c;您應該使用 Gradle 和插件這兩者的最新版本。 插件版本所需的 Gradle 版本1.0.0 - 1.1.32.2.1 - 2.31.2.0 - 1.3.12.2.1 - 2.91.5.02.2.1 - 2.132.0.0 - 2.1.22.10 - 2.132.1.3 - 2.2…

JS時間戳和時間互轉

https://www.cnblogs.com/nield-bky/p/6040853.html http://blog.csdn.net/csdn565973850/article/details/73838583 時間轉時間戳&#xff1a; javascript獲得時間戳的方法有四種&#xff0c;都是通過實例化時間對象 new Date() 來進一步獲取當前的時間戳1.var timestamp1 Da…

C語言試題157之從鍵盤輸入一個字符串,將小寫字母全部轉換成大寫字母,然后輸出到一個磁盤文件“test”中保存。 輸入的字符串以!結束

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款模擬面試、刷題神器?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目:從鍵盤輸入一個字符串,將小…