日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
概述C#調(diào)用Windows服務(wù)

Windows服務(wù)是獨(dú)立于登錄用戶而工作的Windows應(yīng)用程序,它通常在計算機(jī)啟動時開始執(zhí)行,且常常連續(xù)執(zhí)行,直到計算機(jī)關(guān)閉為止。像Exchange Server,IIS和殺毒軟件等都使用這種方式,這樣就可以獨(dú)立于某一用戶而且可以在任何用戶登錄前來運(yùn)行,同時也可以服務(wù)于所有的進(jìn)程,從而以一種服務(wù)的形式存在。

專業(yè)成都網(wǎng)站建設(shè)公司,做排名好的好網(wǎng)站,排在同行前面,為您帶來客戶和效益!成都創(chuàng)新互聯(lián)為您提供成都網(wǎng)站建設(shè),五站合一網(wǎng)站設(shè)計制作,服務(wù)好的網(wǎng)站設(shè)計公司,成都做網(wǎng)站、成都網(wǎng)站建設(shè)負(fù)責(zé)任的成都網(wǎng)站制作公司!

正因為Windows服務(wù)有著這么多的特性,因此,當(dāng)需要一些特殊功能的時候就可以考慮C#調(diào)用Windows服務(wù)來解決問題。比如下面我們要做的這個例子。對于我們這些程序設(shè)計人員,計算機(jī)是在一起工作時間最長的伙伴,每天都會對著它的屏幕八個小時以上,還不包括下班后在家打游戲的時間,因此,保護(hù)眼睛是最重要的了。問題的起因來源于本人周六去眼科對激光手術(shù)的復(fù)查,大夫一再向我強(qiáng)調(diào)眼睛的自我調(diào)節(jié)能力,就是說只要你能保證你每隔一個小時左右就閉眼休息或向遠(yuǎn)處眺望,離開電腦屏幕,那么已經(jīng)治好的近視就不會反彈。本人雖是自律性比較強(qiáng)的人,但在計算機(jī)屏幕面前就不再如此了,往往幾個小時也不抬頭一次,為了眼睛的健康,我決定把這個艱巨的任務(wù)交由計算機(jī)來完成,讓它在一小時左右自動提醒我休息五分鐘。如此一來,豈不是再也不用顧慮這件事了。

功能雖然簡單,但要寫個程序放在啟動組里每天自動運(yùn)行也不是一個好的辦法,正巧以前也沒做過Windows服務(wù),不如索性來試一試,同進(jìn)也看看.NET為我們提供了多么先進(jìn)的功能吧,于是決定,就用C#來做一個提醒我保護(hù)眼睛的Windows服務(wù),取名就叫CareEye吧。

運(yùn)行Visual Studio.NET 2003,建立一個C#調(diào)用Windows服務(wù)項目,在CareEye.cs的設(shè)計視圖提示可以把需要的控件和組件拖動到這上面,假如想要做系統(tǒng)日志的話當(dāng)然就可以把EventLog組件拖過來了,不過這個程序好像不需要這些東西,還是算了吧。那么計時要不要采用計時器控件呢?想了一下,這個控件雖然好用,但太常用了,本著學(xué)習(xí)新知識的原則,最恰當(dāng)?shù)目峙戮褪蔷€程了,而且在以后做其他Windows服務(wù)的時候線程肯定是必需的,所以還是用線程好,這樣我只要在線程中完成對時間的監(jiān)測,把線程的啟動和停止交給服務(wù)的啟動和停止,呵,很方便啊。

再來看CareEye.cs的源程序,一大堆沒見過的東西,不過仔細(xì)分析一下也就沒什么了。CareEye類派生于ServiceBase類,因此繼承了基本服務(wù)類的特性,顯然Main()方法會由SCM(服務(wù)控制管理程序)調(diào)用,在這個方法中Run一個新的CareEye實例,這樣就運(yùn)行了一個Windows服務(wù),OnStart()和OnStop()明顯是用于啟動和停止服務(wù)的響應(yīng)函數(shù)了。

注意在Main()方法中有一個ServiceBase[]的數(shù)組,它是為那些一個服務(wù)進(jìn)程包含多個服務(wù)準(zhǔn)備的,對于這個程序來說,它只有一個 CareEye服務(wù),因此完全可以把這個數(shù)組刪除,而只是使用System.ServiceProcess.ServiceBase.Run(new CareEye());一句就夠了。

接下來為了使用線程,需要引入System.Threading命名空間,為了使用對話框,還需要引入System.Windows.Forms命名空間,這是為了將來提示用戶時顯示對話框而準(zhǔn)備的。

下面為類CareEye添加一個成員字段private Thread MainThread;同時在構(gòu)造函數(shù)中對其進(jìn)行初始化:

 
 
 
  1. MainThread=new Thread(new ThreadStart(ThreadFunc));  
  2. MainThread.Priority=ThreadPriority.Lowest; 

這里把線程的優(yōu)先級設(shè)到最低,這樣不會耗用過多的系統(tǒng)性能。這個線程對象使用ThreadFunc作為線程函數(shù),因此將這個線程函數(shù)補(bǔ)充完整:

 
 
 
  1. public static void ThreadFunc()  
  2. {  
  3. int LastHour=DateTime.Now.Hour;  
  4. while (true)  
  5. {  
  6. System.Threading.Thread.Sleep(60000);  
  7. if (DateTime.Now.Hour-1==LastHour)  
  8. {  
  9. MessageBox.Show,MessageBoxButtons.OK,MessageBoxIcon.Warning,
    MessageBoxDefaultButton.Button1,  
  10. MessageBoxOptions.DefaultDesktopOnly);  
  11. LastHour=DateTime.Now.Hour;  
  12. }  
  13. }  

余下的代碼就簡單了,只要在OnStart中啟動線程,在OnStop中停止線程就行了。

以上的服務(wù)程序雖然很簡單,線程的處理上也不很恰當(dāng),也違背了很多服務(wù)程序的原則比如界面顯示等,但對于本人的需求而言是足夠了,因此就如此制作了。如果你有需要,當(dāng)然可以把對話框改為其他的提醒方式如響鈴等,線程也可以使用內(nèi)核對象同時使用更好的處理方法。

Windows服務(wù)就做完了,余下的就是要測試了,但發(fā)現(xiàn)這個EXE無法運(yùn)行,它會提示你該EXE需要使用安裝程序來安裝服務(wù),看來不可能寫一個程序就算是Windows服務(wù)了,還要把它注冊到Windows才行。

接下來,右擊CareEye.cs的設(shè)計視圖,添加安裝程序,(VS.NET想得就是挺周到的),這下又出來一批代碼,不過好在不用改代碼了,只要把 Account的賬戶類型設(shè)成LocalSystem,把StartType設(shè)成手動啟動就行了,這里用手動是為了方便調(diào)試,以后可以改成自動類型。

編譯完后,還是無法運(yùn)行,此處還需要一步,就是運(yùn)行installutil來安裝這個服務(wù),其安裝和卸載的用法為:

installutil CareEye.exe
installutil /u CareEye.exe

安裝完后能過系統(tǒng)的服務(wù)管理器你就可以看到你的服務(wù)了,只要點(diǎn)擊啟動就可以把它啟動,把時間向前改一個小時它就會提醒你需要休息了,呵呵,夠簡單了吧。

如果你想制作成安裝包分發(fā)給自己的朋友,只需要再添加個部署項目就行了,不過為了完成自注冊,要在自定義操作編輯器中的安裝階段添加一個自定義的安裝操作,把InstallerClass屬性設(shè)成TRUE即可。

以下是careeye.cs的源程序:

 
 
 
  1. using System;  
  2. using System.Collections;  
  3. using System.ComponentModel;  
  4. using System.Data;  
  5. using System.Diagnostics;  
  6. using System.ServiceProcess;  
  7. using System.Threading;  
  8. using System.Windows.Forms;  
  9. namespace CareEye  
  10. {  
  11. public class CareEye : System.ServiceProcess.ServiceBase  
  12. {  
  13. private Thread MainThread;  
  14. ///  
  15. /// 必需的設(shè)計器變量。  
  16. ///  
  17. private System.ComponentModel.Container components = null;  
  18.  
  19. public CareEye()  
  20. {  
  21. // 該調(diào)用是 Windows.Forms 組件設(shè)計器所必需的。  
  22. InitializeComponent();  
  23.  
  24. // TODO: 在 InitComponent 調(diào)用后添加任何初始化  
  25. MainThread=new Thread(new ThreadStart(ThreadFunc));  
  26. MainThread.Priority=ThreadPriority.Lowest;  
  27. }  
  28.  
  29. // 進(jìn)程的主入口點(diǎn)  
  30. static void Main()  
  31. {  
  32. //System.ServiceProcess.ServiceBase[] ServicesToRun;  
  33.  
  34. // 同一進(jìn)程中可以運(yùn)行多個用戶服務(wù)。若要將  
  35. //另一個服務(wù)添加到此進(jìn)程,請更改下行  
  36. // 以創(chuàng)建另一個服務(wù)對象。例如,  
  37. //  
  38. // ServicesToRun = New System.ServiceProcess.ServiceBase[] {
    new CareEye(), new MySecondUserService()};  
  39. //  
  40. //ServicesToRun = new System.ServiceProcess.ServiceBase[] { 
    new CareEye() };  
  41.  
  42. System.ServiceProcess.ServiceBase.Run(new CareEye());  
  43. }  
  44.  
  45. ///  
  46. /// 設(shè)計器支持所需的方法 - 不要使用代碼編輯器  
  47. /// 修改此方法的內(nèi)容。  
  48. ///  
  49. private void InitializeComponent()  
  50. {  
  51. //  
  52. // CareEye  
  53. //  
  54. this.ServiceName = "CareEye";  
  55.  
  56. }  
  57.  
  58. ///  
  59. /// 清理所有正在使用的資源。  
  60. ///  
  61.  
  62. protected override void Dispose( bool disposing )  
  63. {  
  64. if( disposing )  
  65. {  
  66. if (components != null)  
  67. {  
  68. components.Dispose();  
  69. }  
  70. }  
  71. base.Dispose( disposing );  
  72. }  
  73.  
  74. ///  
  75. /// 設(shè)置具體的操作,以便服務(wù)可以執(zhí)行它的工作。  
  76. ///  
  77. protected override void OnStart(string[] args)  
  78. {  
  79. // TODO: 在此處添加代碼以啟動服務(wù)。  
  80. MainThread.Start();  
  81. }  
  82.  
  83. ///  
  84. /// 停止此服務(wù)。  
  85. ///  
  86. protected override void OnStop()  
  87. {  
  88. // TODO: 在此處添加代碼以執(zhí)行停止服務(wù)所需的關(guān)閉操作。  
  89. MainThread.Abort();  
  90. }  
  91. public static void ThreadFunc()  
  92. {  
  93. int LastHour=DateTime.Now.Hour;  
  94. while (true)  
  95. {  
  96. System.Threading.Thread.Sleep(60000);  
  97. if (DateTime.Now.Hour-1==LastHour)  
  98. {  
  99. MessageBox.Show,MessageBoxButtons.OK,MessageBoxIcon.Warning,
    MessageBoxDefaultButton.Button1,MessageBoxOptions.DefaultDesktopOnly);  
  100. LastHour=DateTime.Now.Hour;  
  101. }  
  102. }  
  103. }  
  104. }  
  105. }  

以上介紹C#調(diào)用Windows服務(wù)


分享名稱:概述C#調(diào)用Windows服務(wù)
分享URL:http://m.5511xx.com/article/dhpihoj.html