我们正在尝试实施一个在同一进程下启动多个服务的Windows服务。根据我见过的代码,你会做以下事情:
static void Main()
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new Service1(),
new Service2()
};
ServiceBase.Run(ServicesToRun);
}
但是,此代码仅执行Service1而不执行Service2。 Service1和Service2都是自己执行的。有什么想法吗?
答案 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()。
希望有所帮助!