注意:我没有做与Topshelf installer requires me to press enter twice - why?
类似的任何操作服务类(有趣的部分):
public class ServiceCore
{
public ServiceCore(ServiceRuntimeConfiguration serviceRuntimeConfiguration)
{
_runningTasks = new List<Task>();
}
public bool Start(HostControl hostControl)
{
_hostControl = hostControl;
_messageProcessor.Start(); // Starts a System.Threading.Tasks.Task
StartListener(); // starts a System.Threading.Tasks.Task
return true;
}
}
的Program.cs:
Host host = HostFactory.New(configurator =>
{
configurator.UseNLog();
// Configure core service
configurator.Service<ServiceCore>(svc =>
{
svc.ConstructUsing(theService => new ServiceCore(_serviceRuntimeConfiguration));
svc.WhenStarted((svc, hostControl) => svc.Start(hostControl));
svc.WhenStopped((svc, hostControl) => svc.Stop(hostControl));
});
// Configure recovery params
configurator.EnableServiceRecovery(recoveryConfigurator =>
{
recoveryConfigurator.RestartService(0);
recoveryConfigurator.OnCrashOnly();
recoveryConfigurator.SetResetPeriod(1);
});
// Execute HostConfigurator
host.Run();
}
问题
当我这样做时:
MyService.exe install --manual --localsystem
服务安装正常,但命令永远不会返回:
运行事务安装。
开始安装的安装阶段。安装服务 NotificationEngine.Main ...服务NotificationEngine.Main已经 已成功安装。
安装阶段成功完成,提交阶段为 开始。
提交阶段已成功完成。
已完成事务处理安装。
^ C(我必须按CTRL + C)
我应该怎样做才能使install命令完成然后返回?
注意如果我运行帮助(即帮助显示但命令未返回),则可观察到相同的行为:
MyService.exe help
答案 0 :(得分:2)
通常,这意味着您不会释放对某些资源的控制权,并且该流程无法彻底退出。然而,这些东西很复杂,所以很难肯定。
我会尝试一些事情
MyService start
会发生什么?我假设它也会因为帮助而阻塞。 Main()
入口点还有什么用?它在host.Run()
之后做了什么吗?上面的代码使得它看起来像是在构造该对象时调用它,但我认为它是糟糕的剪切。 ConstructUsing
和When*
回调被触发之前,您没有初始化资源。 在此之后,我会把它带到https://groups.google.com/forum/#!forum/topshelf-discuss的邮件列表中。
答案 1 :(得分:0)
ServiceCore:ServiceBase
在configurator.Service中指定的类型T应该是ServiceBase的子类。
这解决了可以正常安装但挂起安装/卸载最后一步的服务的问题。