Как запустить одну или несколько служб Topshelf из консольного приложения в отдельных потоках

У меня есть консольное приложение, написанное для приема аргументов командной строки, которые будут использоваться при определении количества необходимых служб Windows. Командная строка для консольного приложения выглядит следующим образом: consoleapp.exe -server:11 -azure:7, где -server указывает службу Windows, а -azure указывает веб-задание Azure. [ПРИМЕЧАНИЕ: этот вопрос относится только к службе Windows, но я хотел показать, что консольное приложение потенциально может иметь много аргументов.] В консольном приложении я анализирую командную строку и, если команда соответствует " -server", то я хочу создать службу Windows с помощью TopShelf. Потенциально у меня может быть несколько серверных команд в командной строке консольного приложения или одиночные серверные команды с несколькими значениями, например: -server:11,7 или -server:11 -server:7 Для для каждого отдельного -сервера/значения я создаю задачу, которая, в свою очередь, создает и запускает службу Topshelf, например:

                TopshelfExitCode retCode = HostFactory.Run(x =>
        {
            x.Service<TopshelfWindowsService>(sc =>
            {
                sc.ConstructUsing(name => new TopshelfWindowsService(companyConfig, runnerProgress));
                sc.WhenStarted((s, hostControl) => s.Start(hostControl));
                sc.WhenShutdown(s => s.Shutdown());
                sc.WhenStopped((s, hostControl) => s.Stop(hostControl));
            });
            //
            x.SetServiceName($"CommRunner {companyConfig.CompanyName + companyConfig.CompanyId}");
            x.SetDescription($"Runner for CompanyID ({companyConfig.CompanyId})");
            x.SetDisplayName($"Runner {companyConfig.CompanyId}");
            //
            x.StartAutomaticallyDelayed();
        });

Моя проблема в том, что Topshelf, по-видимому, использует аргументы командной строки консольного приложения во время настройки службы, и в итоге я получаю сообщение об ошибке: «[Ошибка] Командная строка. Обнаружен неизвестный параметр командной строки: DEFINE: server = 11».

Можно ли делать то, что я пытаюсь сделать, и при этом использовать Topshelf? Есть ли способ отключить использование командной строки при настройке службы в Topshelf?


person JNickVA1    schedule 04.02.2018    source источник


Ответы (1)


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

Взгляните на функциональность AddCommandLineSwitch, позволяющую создавать и использовать собственные аргументы.

x.AddCommandLineSwitch("server", v => server = v);
x.AddCommandLineSwitch("azure", v => azure= v);
x.ApplyCommandLine();

Отсюда синтаксис:

-server:11 -azure:7 

См. Как я могу использовать аргументы командной строки, которые не распознаются TopShelf? для получения дополнительной информации.

Помните, что они работают только на этапе установки. Чтобы использовать эти параметры при запуске службы, см. topshelf">Как указать параметры командной строки для службы в TopShelf

person reckface    schedule 16.04.2018