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

#vb.net #service #windows-services

#vb.net #Обслуживание #windows-services

Вопрос:

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

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

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

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

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

Ответ №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();


    } 
}
  

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

Комментарии:

1. 17 голосов за вопрос и ни одного за ответ? Я не уверен, почему, поскольку это хороший