C# Topshelf:install命令在成功安装服务后不会返回
注意:我没有做任何类似的事情 服务类别(有趣的部分): 服务安装正常,但命令永远不会返回: 正在运行事务处理安装 开始安装的安装阶段。安装服务 通知引擎。主。。。Service NotificationEngine.Main已被删除 已成功安装 安装阶段已成功完成,提交阶段已完成 开始 提交阶段已成功完成 已完成事务处理的安装 ^C(我必须按CTRL+C) 要完成install命令并返回,我应该做什么 注意如果我运行帮助,则可以观察到相同的行为(即显示帮助,但命令不返回):C# Topshelf:install命令在成功安装服务后不会返回,c#,.net,topshelf,C#,.net,Topshelf,注意:我没有做任何类似的事情 服务类别(有趣的部分): 服务安装正常,但命令永远不会返回: 正在运行事务处理安装 开始安装的安装阶段。安装服务 通知引擎。主。。。Service NotificationEngine.Main已被删除 已成功安装 安装阶段已成功完成,提交阶段已完成 开始 提交阶段已成功完成 已完成事务处理的安装 ^C(我必须按CTRL+C) 要完成install命令并返回,我应该做什么 注意如果我运行帮助,则可以观察到相同的行为(即显示帮助,但命令不返回): 一般来说,这意味着您
一般来说,这意味着您不能释放对某些资源的控制,并且进程不能干净地退出。然而,这些东西很复杂,所以很难说清楚 有几件事我想试试
- 安装/CTRL+C后执行
时会发生什么?我假设它也会阻塞,因为帮助会阻塞李>MyService start
- 检查日志记录,是否启用了任何日志记录?是否存在文件争用或权限问题
- 您的
入口点还做什么?它是否在执行host.Run()之后的操作?上面的代码使它看起来像是从该对象的构造中调用的,但我认为这是糟糕的剪切粘贴李>Main()
- 确保在启动*回调时,使用
和
构造函数之前没有初始化资源李>
在这之后,我会把这个带到我们的邮件列表中 ServiceCore:ServiceBase configurator.Service中指定的类型T应为ServiceBase的子类
这修复了一个服务的问题,该服务可以很好地安装,但会挂在安装/卸载的最后一步。感谢您详细的回答。我查一下再寄回来。
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;
}
}
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
MyService.exe help