2010-07-30 118 views
1

我如何可以調用自定義的方法在Windows服務:調用自定義方法

public class TestService:ServiceBase 
{ 
    public TestService() 
    { 
     // constructor 
    } 

protected override void OnStart(string[] args) 
{ 
    // do some work here 
} 

protected override void OnStop() 
{ 
    // do some work here 
} 

public void TestMethod(int arg) 
{ 
    // do some work here 
} 
} 

我知道服務的名稱是「TestService的」,這樣我就可以做到以下幾點:

ServiceController sc = new ServiceController("TestService"); 

但如果我這樣做,這是行不通的

sc.TestMethod(5);  // cannot do this 

我怎麼能對服務的訪問的方法?我正在使用c#

謝謝。

回答

0

您似乎被「服務」這個詞的兩種不同用法所困惑。

一方面有「服務過程」,這是「長期運行」的後臺進程,在後臺工作,很少用戶可以看到。這就是你在上面創建的。但是,您通常不會直接在這樣的服務上調用方法 - 這是一個進程,而不是對象

然後有「服務API」,在.NET中通常意味着WCF。服務API是一組可以遠程訪問的方法 - 跨進程甚至從一臺計算機到另一臺計算機。 WCF提供了一種超簡單的方式來創建和使用.NET中的這些服務。

「服務進程」可能託管一個「服務API」 - 事實上,它通常是。但在這種情況下,您需要定義和調用服務接口,而不僅僅是調用ServiceController對象上的方法。

1

您通常不會訪問Windows服務上的方法。你想達到什麼目的?

Windows服務可以承載可從其他應用程序訪問的WCF服務。這可能是你正在尋找的東西。

+0

Windows服務正在處理一些請求。它創建20個線程。當滿足某些條件時,我需要殺死其中一個線程。 – 2010-07-30 19:54:28

+1

然後,您應該在Windows服務中託管一個小WCF服務。被調用時,這將設置一個標誌,該標誌從您想要死的線程中可見。當該線程看到設置的標誌時,它會自行終止。一般來說,殺死線程是一個壞主意。 – 2010-07-30 19:58:45

1

您可以通過執行ServiceBase.OnCustomCommand來處理Windows服務的自定義命令,並通過調用ServiceController.ExecuteCommand發送它們。

但是,這種「命令」只是128到256之間的命令標識符。沒有參數或返回值。

在大多數情況下,這是不夠的,您必須在Windows服務中託管WCF服務,正如其他人所建議的那樣。