Windows服务:同一服务类的多个实例?

qJa*_*ake 8 vb.net service windows-services

创建Windows服务时,您将创建要启动的服务列表.默认是这样的:

ServicesToRun = New System.ServiceProcess.ServiceBase() {New Service}
Run Code Online (Sandbox Code Playgroud)

你能拥有相同Service类的多个实例(绑定到不同的地址或端口),像这样吗?

ServicesToRun = New System.ServiceProcess.ServiceBase() {New Service("Option1"), New Service("Option2")}
Run Code Online (Sandbox Code Playgroud)

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

edv*_*dig 1

服务本身不绑定到地址或端口。您可以让服务启动执行此操作的线程或任务,这样一个服务就可以启动线程来侦听例如 http 和其他地址:端口或您希望它执行的任何操作。

下面的示例向您展示了我的意思,它是用 C# 编写的,但如果它不能很好地翻译给您,那么可以使用它来翻译. 在您的情况下,我的主要功能将是您服务的启动功能。

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();


    } 
}
Run Code Online (Sandbox Code Playgroud)

另外,这里有一个很好的总结,说明为什么您的第一种方法不起作用,以及如何解决这个问题的替代方法