2009-08-21 82 views
6

我在寫一個簡單的Windows服務,每個月都會向所有員工發送電子郵件。我的問題是,如何在完成後自行停止?我是這個領域的noobie,所以請幫助我。非常感謝。如何以編程方式停止Windows服務?

它會在服務器上被部署爲每月運行。我沒有開始這件事,代碼就這樣給了我。它是用VB.NET編寫的,現在我被要求改變一些東西。我注意到只有'Sub OnStart',並想知道服務何時會停止?主分支完成後,該服務的狀態如何?它停下來還是掛在那裏?對不起,正如我所說的,我對此很新....

回答

7

如果你有一個每月復發的任務,你最好先編寫一個控制檯應用程序,然後使用Windows Task Scheduler將它設置爲每月運行一次。如果這是一個Win32服務(即使用C或C++編寫),那麼你只需調用SetServiceStatus()函數,就可以使用服務來處理需要長時間運行或不斷用戶登錄的進程

+0

它將被部署在每月運行的服務器上。我沒有開始這件事,代碼就這樣給了我。它是用VB.NET編寫的,現在我被要求改變一些東西。我注意到只有'Sub OnStart',並想知道服務何時會停止?主分支完成後,該服務的狀態如何?它停下來還是掛在那裏?對不起,正如我所說的,我對這個真的很陌生...... – cplusplusNewbie 2009-08-21 15:17:36

+1

如果你是新手,那麼這是一個讓你自己看起來不錯的好時機,並且用宏指令的方式向決策者提出建議。服務不是每月使用一次,而是連續的。對於您提到的情況,將代碼從Windows服務中拖出並放入控制檯應用程序非常簡單。 – MattH 2009-08-25 15:19:27

3

SERVICE_STOPPED)並從ServiceMain返回。

在另一方面,如果你只是發送電子郵件,每月一次,爲什麼要使用服務呢?使用Windows任務計劃程序並運行正常的應用程序或腳本。

0

它可能會更好寫這一個計劃任務,它肯定會更容易開始發展。那麼它自然會終止,並且不會在本月其餘時間消耗資源。

要回答原來的問題,你可以在C#中獲取的當前運行服務的列表

services = System.ServiceProcess.ServiceController.GetServices(); 

然後尋找你想要的並置,以停止

locatedService.Status == ServiceControllerStatus.Stopped 

全部例如on msdn

0

淨停止[SERVICE_NAME] ...在命令行上會做到這一點。

但是,我同意其他人;看來Windows任務計劃程序將更好地滿足您的需求。

6

正如所有其他答案已經指出,這聽起來像這應該是你運行一個計劃任務的可執行文件或腳本。但是,如果您有義務以某種原因作爲Windows服務運行並且您正在使用.NET,則只需在您的服務完成其工作後調用從ServiceBase繼承的方法Stop()。從MSDN文檔的方法:

Stop方法設置服務狀態 指示停止已掛起, 調用調用OnStop方法。 應用程序停止後,服務 狀態設置爲停止狀態。如果 應用程序是託管服務,則卸載應用程序域 。

這裏有一個重要的警告:在其下運行服務必須有權停止服務(這是一個主題爲ServerFault)的用戶帳戶。

一旦服務的OnStart方法完成,它會繼續運行(什麼都不做),直到事情告訴它停止在下列方式之一:

0

是否有一個原因,它已經是Windows服務?如果不是,請按照@Macros解決方案進行操作。但是,如果是這樣,那麼爲什麼要停止服務?如果你停止它,那麼當需要發送電子郵件時,它將不得不重新啓動。根據你的描述,這聽起來不像需要大量資源,所以我建議安裝它並讓它運行,每月啓動一次發送電子郵件。

0

這是我在類似情況下所做的。

windows服務全天候運行並處理工作單元。它通過數據庫視圖獲取工作單元。

表信息
  ProcessingStartTime
  CompletionDTE
  ...

數據庫視圖只翻出記錄標記爲非完成和過去有ProcessingStartTime。所以在服務確認事務之後,它會執行更新數據庫記錄的存儲過程。對於這個系統,最終用戶將excel文件上傳到asp.net webfrom,將它們導入到數據庫中。