2009-12-08 205 views
6

我在Windows服務(.NET C#)中有一個計時器。我需要能夠從外部程序中更改經過的值。如果定時器當前正在運行,我需要能夠縮短來自外部程序的時間經過值。我正在考慮在服務中使用一個公共方法來改變計時器的過期值並重新啓動計時器,但是外部程序是否可以在Windows服務上調用公共方法?調用Windows服務的公共方法

回答

8

總之,不可能在另一個進程中直接調用函數。包含您想要訪問的函數(在本例中爲Windows服務)的進程需要通過某種IPC(進程間通信)來公開它。您選擇哪種類型的IPC可能取決於通信的複雜程度以及「客戶端」是否爲.NET應用程序。

如果您的需求很簡單(例如只設置一個計時器值),或者如果您的客戶端不使用.NET,那麼使用命名管道(或TCP,如果您需要從另一臺物理機器訪問服務)最好的選擇。命名管道和TCP都爲您提供了一個Stream,您可以將消息寫入另一端並在其上讀取。

如果您需要公開許多不同的函數或發送和接收復雜的數據類型,並且如果您在兩端都使用.NET,.NET Remoting或WCF可能是最好的。 .NET Remoting更簡單,但有更多的限制; WCF非常靈活,但學習曲線陡峭。

+1

.NET Remoting被認爲是傳統技術,不建議用於新開發(http://msdn.microsoft.com/zh-cn/library/72x4h507%28VS.85% 29.aspx)。 Windows Communication Foundation(WCF)是批准的方式。如果您不熟悉WCF,請觀看此視頻(http://www.dnrtv.com/default.aspx?showNum=135)以獲取該技術的介紹。 – 2009-12-09 14:38:29

4

您不能直接在Windows服務進程中調用方法,但可以讓Windows服務將此函數作爲WCF服務公開。 Windows服務也將充當服務主機。這是可能的,並不複雜。

5

是的,這是可能的。

您可能需要考慮在您的服務上創建NetNamedPipe端點並通過該接口控制服務。

NetNamedPipeBinding binding = new NetNamedPipeBinding(); 
MyService myService = new MyService(binding, 
       new EndpointAddress("net.pipe://localhost/MyService")); 
myService.ResetTimer(30); 
+0

MyService未使用2個參數.. – 2013-11-21 06:40:22

2

舊的(非WCF)服務可以使用.NET Remoting。有關如何開始的一些信息,請看看here。這是WCF之前的跨進程邊界的應用程序之間進行通信的方式。