同一进程下的多个Windows服务无法启动

时间:2009-11-06 00:10:18

标签: c# .net windows-services

我们正在尝试实施一个在同一进程下启动多个服务的Windows服务。根据我见过的代码,你会做以下事情:

    static void Main()
    {
        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[] 
        { 
            new Service1(),
            new Service2()
        };
        ServiceBase.Run(ServicesToRun);
    }

但是,此代码仅执行Service1而不执行Service2。 Service1和Service2都是自己执行的。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

我认为您可能希望创建一个子服务模型,其中可以从主Windows服务启动任意数量的子服务。

public interface ISubService
{
   void Initialize( XmlElement xmlSection );
   bool Start( );
   void RequestStop( );
   void Stop( TimeSpan timeout );
}

然后可能是一个基本的线程服务类..

public abstract class ThreadedService : ISubService
{
     private Thread m_thread;

     private ThreadedService( )
     {
        m_thread = new Thread( new ThreadStart( StartThread ) );
     }

     // implement the interface
}

通过app.config和IConfigurationSectionHandler ...

配置您的服务
public class ServiceConfigurationHandler : IConfigurationSectionHandler
{
   public ServiceConfigurationHandler() { }

   public object Create(object parent, object configContext, XmlNode section)
   {
       return new ServiceConfiguration((XmlElement)section);
   }
}

处理配置部分的东西......

public class ServiceConfiguration
{
   public static readonly ServiceConfiguration Current = (ServiceConfiguration)ConfigurationManager.GetSection("me/services");

   private List<ISubService> m_services;
   private string m_serviceName;

   internal ServiceConfiguration(XmlElement xmlSection)
   {
       // loop through the config and initialize the services
       // service = createinstance(type)..kind of deal
       // m_services.Add( service );
   }

   public void Start( )
   {
       foreach( ISubService service in m_services ) { service.Start( ); }           
   }
   public void Stop( ) { ... }
}

然后你只需创建你的子服务所需的许多基于线程服务的类,然后将它们全部放入app.config ......就像..

<me>
  <services>
     <service type="my.library.service1,my.library" />
     <service type="my.library.service2,my.library" />
  </services>
</me>

最后,在您的实际服务代码中,只需要在开始时执行ServiceConfiguration.Current.Start(),在退出时执行Service.Configuration.Current.Stop()。

希望有所帮助!