2009-08-21 84 views
0

我創建了一個C#windows服務(Serv.exe),它負責在正在運行的應用程序(A.exe)的請求下執行各種任務,其中一些可能需要很長時間並且我需要一種方法來從調用應用程序(A.exe)中瞭解我所請求的操作(在服務上運行)的狀態。如何獲取Windows服務自定義狀態? [C++/C#]

目前我已經開始實現這個的方法是通過使用ControlService(句柄,命令,狀態)向服務發送自定義命令來執行被請求的任務,我也使用QueryServiceStatus(句柄,狀態)從SCM獲得服務的狀態 - 所以基本的管道工作就在那裏並且正在工作。

現在我遇到的問題是,在發送我的ControlService命令(工作正常)後,調用應用程序(A.exe)繼續運行,並且在某個點上,它需要知道它請求的服務任務是否完成 - 因此我正在尋找一種方法來查詢服務來報告自定義狀態,而不是實際服務的標準運行,停止,掛起,暫停狀態,但是我使用ControlService()所做的請求的狀態請求。

這是可能的嗎? 任何幫助或暗示都會受到人們的讚賞。

感謝,

回答

1

在過去,當我不得不處理更復雜的通信,我通常從QueryServiceStatus切換到具有服務實際上通過IPC提供的通信手段。

SocketsPipes這兩個工作都很好。客戶和服務在這種溝通方式上可以擁有無​​限的自由。

+0

看看使用套接字,管道或RPC(或者像註冊表這樣的詭計)而不是使用Windows消息傳遞的原因,它將無法在Vista中運行,因爲微軟已經在使用會話的服務和應用程序之間實現了隔離。 – 2009-08-21 16:49:08

+0

這將是更喜歡的方法?問題是我每隔23分鐘只發送一次命令到服務器,所以打開端口和通道/管道似乎是過度殺傷性的 - 我認爲Command很好,因爲它非常簡單,並確保交付,而不用擔心安全,權限等等。 那麼有沒有辦法讓自定義狀態回來? – Shaitan00 2009-08-21 16:50:30

+0

我其實很喜歡Pipes(我喜歡的方法),特別是如果你使用C#。命名管道和匿名管道工作得非常好,開銷相當低。如果您的客戶端應用程序與服務在同一臺計算機上運行,​​則它們特別容易。這種方法的另一個優點也是易於擴展。隨着時間的推移,你總是可以添加更多的消息。管道可以是雙向的,所以服務器可以直接通知客戶端(不需要查詢)等。 – 2009-08-21 16:57:38

0

對我來說,很好的建立一個外部隊列,如MSMQ或數據庫表。這些代碼很容易編寫,支持應用程序和服務之間的雙向通信,允許多個應用程序甚至可以通過網絡與一項服務交談,並允許您關閉應用程序並稍後啓動並保持消息不變。此外,調試更容易,因爲您可以檢查流量,特別是在使用數據庫並將消息標記爲已讀而不是將其刪除時。當您不想使用重量級數據庫或不想擔心MSMQ是否已安裝或正在運行時,通過System.Data.Sqlite包裝器處理SQLite是完美的。

另一種選擇是將您的邏輯放入WCF服務中,並通過HTTP或TCP與其通信。

+0

我認爲MSMQ要求我安裝一些東西(MSMQ),不允許有更多的第三方工具。但是我們已經安裝了SQL 2005 - 這是我沒有考慮過的用於這種小型通信的想法。 WCF支持.Net 2.0? 你的意思是使用TCP(套接字)調用應用程序(C++ 6)通信到服務(WCF)?對於來自調用應用程序的一次(23分鐘)請求而言,這不是過度殺傷力嗎?並不需要打開端口等...?我需要減少影響,並且不能讓IT參與其中。 – Shaitan00 2009-08-21 17:15:50

+0

一些評論 - 從VC++ 6使用MSMQ並不是微不足道的。 WCF是.NET 3.0+。 – 2009-08-21 17:34:11

+0

那麼,如果你不能安裝任何東西,並且僅限於VC++ 6和.Net 2.0,那麼一個小型的SQL Server 2005表就可以容易地獲得服務中的消息。這也是從服務中捕獲狀態消息和錯誤的好方法。 – 2009-08-21 18:35:45