【问题标题】:Windows Service: Multiple instances of the same service class?Windows 服务:同一服务类的多个实例?
【发布时间】:2011-08-17 19:12:03
【问题描述】:

创建 Windows 服务时,会创建要启动的服务列表。默认是这样的:

ServicesToRun = New System.ServiceProcess.ServiceBase() {New Service}

你可以拥有同一个服务类的多个实例(绑定到不同的地址或端口),像这样吗?

ServicesToRun = New System.ServiceProcess.ServiceBase() {New Service("Option1"), New Service("Option2")}

或者这会导致问题吗?我们应该使用两个不同的类吗?解决这个问题的最佳方法是什么?

【问题讨论】:

    标签: vb.net service windows-services


    【解决方案1】:

    服务本身不绑定到地址或端口。您可以使服务启动线程或执行任务,因此一项服务可以启动线程以进行侦听,例如http 和其他地址:端口或任何你想做的事情。

    以下示例向您展示了我的意思,它是在 C# 中,但如果它不能很好地翻译给您,请使用 this to translate。在您的情况下,我的主要功能是您的服务的启动功能。

    public abstract class ServiceModuleBase
    {
        public abstract void Run();
    }
    
    public class SomeServiceModule : ServiceModuleBase
    {
       //Implement Run for doing some work, binding to addresses, etc.
    }
    
    public class Program
    {
    
        public static void Main(string[] args)
        {
    
            var modules = new List<ServiceModule> {new SomeServiceModule(), new SomeOtherServiceModule()};
    
            var tasks = from mod in modules
                        select Task.Factory.StartNew(mod.Run, TaskCreationOptions.LongRunning);
    
            Task.WaitAll(tasks.ToArray());
    
    
            Console.Out.WriteLine("All done");
            Console.ReadKey();
    
    
        } 
    }
    

    另外,here is a nice summary 为什么您的第一种方法不起作用以及如何解决该问题的替代方法

    【讨论】:

    • +1 Q 有 7 个赞,答案没有?我不知道为什么,因为它是一个很好的
    最近更新 更多