Мы используем TopShelf как так, чтобы начать наши услуги. Мы наблюдаем несколько странные проблемы, связанные с запуском и остановкой службы, и удивляемся, произошло ли это из-за наших асинхронных методов запуска / остановки. Посмотрев на документацию с использованием async, никогда не упоминается. На их страницах github есть одно упоминание , в котором говорится, что вы не должны использовать асинхронность таким образом.
Но, сказав это, он компилируется и работает (в основном) нормально. Так это правильно, или я должен использовать .Wait()
вместо?
var host = HostFactory.New(hostConfig =>
{
hostConfig.Service<StreamClient>(serviceConfig =>
{
serviceConfig.ConstructUsing(name => new StreamClient());
serviceConfig.WhenStarted(async tc => await tc.Start());
serviceConfig.WhenStopped(async tc => await tc.Stop());
});
hostConfig.RunAsLocalSystem();
hostConfig.SetDescription("Stream Client Service");
hostConfig.SetDisplayName("Stream Client Service");
hostConfig.SetServiceName("StreamClientService");
});
host.Run();
@ Nkosi спросил, как выглядят сигнатуры методов, они асинхронны и запускают внутренние клиенты и процессы.
public async Task Start()
{
// Dont start again if we are already running, or if we are already in the starting state
if (this.Running || this.Starting)
{
return;
}
await this.slackService.SendSlackServiceEvent(ServiceEventType.Starting, serviceName, applicationVersion);
this.Starting = true;
this.Stopping = false;
var configurationBuilder = new ClientConfigurationBuilder();
ClientConfiguration clientConfiguration;
if (Constants.UseLocalConnection)
{
await this.OnClientDebugMessage($"Using Local Connection");
clientConfiguration = configurationBuilder.CreateLocalConfiguration();
}
else
{
await this.OnClientDebugMessage($"Using SQL Connection");
clientConfiguration = configurationBuilder.CreateSqlConfiguration();
}
this.ClusterGrainClient = await this.StartClient(clientConfiguration);
if (this.ClusterGrainClient == null)
{
using (ConsoleColours.TextColour(ConsoleColor.Red))
{
await this.OnClientDebugMessage($"Cluster client null, aborting!");
}
return;
}
this.Running = true;
await this.OnClientStarted();
await this.slackService.SendSlackServiceEvent(ServiceEventType.Started, serviceName, applicationVersion);
this.Starting = false;
}