#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 голосов за вопрос и ни одного за ответ? Я не уверен, почему, поскольку это хороший