Topshelf:成功安装服务后安装命令没有return

Topshelf: install command does not return after successfully installing the service

注意:我没有做任何类似于 Topshelf installer requires me to press enter twice - why?

的事情

服务class(有趣的部分):

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

服务安装正常,但命令从不 returns:

Running a transacted installation.

Beginning the Install phase of the installation. Installing service NotificationEngine.Main... Service NotificationEngine.Main has been successfully installed.

The Install phase completed successfully, and the Commit phase is beginning.

The Commit phase completed successfully.

The transacted install has completed.

^C (I have to press CTRL+C)

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

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

MyService.exe help

通常这意味着您没有释放对某些资源的控制,进程无法完全退出。不过这东西比较复杂,不好说。

我会尝试的一些事情

  • 在 install/CTRL+C 之后执行 MyService start 会发生什么?我假设它也会阻塞,因为 help 确实如此。
  • 检查日志记录,你有没有启用?是否存在文件争用或权限问题?
  • 您的 Main() 入口点还有什么作用?它在 host.Run() 之后做了什么吗?上面的代码看起来像是从该对象的构造中调用它,但我认为它很糟糕 cut-n-pasting。
  • 确保在触发 ConstructUsingWhen* 回调之前没有初始化资源。

之后,我会将其发送到我们的 https://groups.google.com/forum/#!forum/topshelf-discuss 邮件列表。

服务核心:服务基础

configurator.Service 中指定的类型 T 应该是 ServiceBase 的子类。

这解决了可以正常安装但在 install/uninstall 的最后一步挂起的服务的问题。