2009-11-06 4 views
0

Nous essayons d'implémenter un seul Windows Services qui démarre plusieurs services sous le même processus. Selon le code que j'ai vu vous faites ce qui suit:Services Windows multiples sous le même processus ne démarre pas

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

Cependant, ce code exécute seulement Service1 et pas Service2. Service1 et Service2 s'exécutent tous seuls. Des idées?

+0

Recherchez-vous deux services Windows physiques distincts ou un service Windows qui remplit deux fonctions? – zac

+0

A quoi ressemble votre Service1/Service2? Ils ont obtenu les deux méthodes OnStart et différents ServiceName? –

+0

@Anders Yep. En fait, les deux vont commencer et fonctionner individuellement très bien. –

Répondre

3

Je pense que vous voudriez créer un modèle de sous-service où l'on pourrait démarrer n'importe quel nombre de sous-services à partir du service Windows principal.

Alors peut-être une base filetée classe de service ..

public abstract class ThreadedService : ISubService 
{ 
    private Thread m_thread; 

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

    // implement the interface 
} 

Configurer vos services par le app.config et un IConfigurationSectionHandler ...

public class ServiceConfigurationHandler : IConfigurationSectionHandler 
{ 
    public ServiceConfigurationHandler() { } 

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

Quelque chose à gérer les sections de configuration ...

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() { ... } 
} 

alors vous suffit de créer mais de nombreuses classes à base de threadedservice dont vous avez besoin pour vos sous-services, et de les jeter tous dans le app.config ... quelque chose comme ..

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

et enfin, dans votre code de service réel, il suffit de faire ServiceConfiguration.Current.Start() au début, et Service.Configuration.Current.Stop() dans la sortie.

Espérons que ça aide!

+0

Ceci est une idée intéressante. Cela nous permettrait-il de compiler de nouvelles bibliothèques indépendamment et de les ajouter au service sans avoir à recompiler le service en les ajoutant à app.config? Ce serait une solution extrêmement extensible! –

+0

Ouais, c'était totalement l'intention avec cette solution. Nous étions continuellement en ajoutant des mini services et je ne voulais pas avoir à toucher le gestionnaire de services Windows. Déposez une nouvelle ligne dans la configuration de l'application, et vous êtes bien. – Sean

Questions connexes