.net 在windows服务上调用自定义方法

.net 在windows服务上调用自定义方法,.net,windows-services,.net,Windows Services,如何在windows服务上调用自定义方法: public class TestService:ServiceBase { public TestService() { // constructor } protected override void OnStart(string[] args) { // do some work here } protected override void OnStop() { // do some w

如何在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#


谢谢。

您通常不会访问Windows服务上的方法。你想完成什么


Windows服务可以承载可从其他应用程序访问的WCF服务。这可能就是你想要的。

你似乎被“服务”这个词的两种不同用法弄糊涂了

一方面,存在“服务流程”,这些流程是在后台工作的长期运行的后台流程,很少(如果有的话)对用户可见。这就是你在上面创造的。然而,您通常不会直接在这样的服务上调用方法——它是一个进程,而不是一个对象

还有“服务API”,在.NET中通常指WCF。服务API是可以远程访问的方法的集合——跨进程,甚至从一台计算机到另一台计算机。WCF提供了一种在.NET中创建和使用此类服务的超级简单的方法


“服务流程”可能承载“服务API”——事实上,它通常承载“服务API”。但是在这种情况下,您需要定义和调用服务接口,而不仅仅是调用
ServiceController
对象上的方法。

您可以通过实现
ServiceBase.OnCustomCommand
来处理Windows服务的自定义命令,并通过调用
ServiceController.ExecuteCommand
来发送这些命令

然而,这种“命令”只是一个介于128和256之间的命令标识符。没有参数或返回值


在大多数情况下,这是不够的,您必须像其他人建议的那样在Windows服务中承载WCF服务。

Windows服务正在处理一些请求。它可以创建20个线程。我需要在满足某个条件时终止其中一个线程。然后你应该在Windows服务中托管一个小的WCF服务。调用时,这将设置一个标志,该标志从您想要的线程可见。当该线程看到设置的标志时,它将自杀。一般来说,杀死线程是个坏主意。