Topshelf:安装命令在成功安装服务后不返回

本文关键字:安装 服务 返回 命令 Topshelf 成功 | 更新日期: 2023-09-27 18:31:27

注意:我没有做任何类似于 Topshelf 安装程序要求我按两次回车键 - 为什么?

服务类别(有趣的部分):

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;
        }
}

课程.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...Service NotificationEngine.Main 已 已成功安装。

安装阶段已成功完成,提交阶段为 开始。

提交阶段已成功完成。

事务处理安装已完成。

^C (我必须按 CTRL+C)

我应该怎么做才能完成安装命令然后返回?

注意如果我运行帮助(即帮助显示但命令不返回),则可以观察到相同的行为:

MyService.exe help

Topshelf:安装命令在成功安装服务后不返回

通常,

这意味着您不会释放对某些资源的控制,并且进程无法完全退出。但是,这些东西很复杂,所以很难确定。

我会尝试的几件事

  • 在安装/CTRL+C 后执行MyService start时会发生什么?我假设它也会阻止,因为帮助确实如此。
  • 检查日志记录,您是否已启用任何日志记录?是否存在文件争用或权限问题?
  • 您的Main()入口点还有什么作用?它是否在做host.Run()之后的事情?你上面的代码看起来就像你从该对象的构造中调用它,但我认为这是糟糕的剪切粘贴。
  • 请确保在触发ConstructUsingWhen*回调之前未初始化资源。

在此之后,我会把它带到我们的邮件列表中 https://groups.google.com/forum/#!forum/topshelf-discuss.

ServiceCore : ServiceBase

配置器中指定的类型 T。服务应该子类服务基础。

这修复了可以正常安装但在安装/卸载的最后一步挂起的服务的问题。