Служба Windows: несколько экземпляров одного и того же класса обслуживания? - PullRequest
8 голосов
/ 03 мая 2011

Когда вы создаете Службу Windows, вы создаете список служб, которые хотите запустить. По умолчанию это:

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

Можете ли вы иметь несколько экземпляров одного и того же класса обслуживания (которые привязаны к разным адресам или портам), как это?

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

Или это вызовет проблемы? Должны ли мы использовать два разных класса вместо этого? Как лучше всего подойти к этой проблеме?

1 Ответ

1 голос
/ 31 августа 2011

Служба сама по себе не привязывается к адресам или портам.Вы можете заставить службу запускать потоки или задачи, которые выполняются, чтобы одна служба могла запускать потоки для прослушивания, например, 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();


    } 
}

Также, вот хорошее резюме о том, почему ваш первый подход не работает, и альтернативный способ обойти это

...