Topshelf:成功安装服务后,install命令不会返回

时间:2016-01-22 04:31:05

标签: c# .net topshelf

注意:我没有做与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

2 个答案:

答案 0 :(得分:2)

通常,这意味着您不会释放对某些资源的控制权,并且该流程无法彻底退出。然而,这些东西很复杂,所以很难肯定。

我会尝试一些事情

  • 安装/ CTRL + C后执行MyService start会发生什么?我假设它也会因为帮助而阻塞。
  • 检查日志记录,您是否已启用?是否存在文件争用或权限问题?
  • 您的Main()入口点还有什么用?它在host.Run()之后做了什么吗?上面的代码使得它看起来像是在构造该对象时调用它,但我认为它是糟糕的剪切。
  • 确保在ConstructUsingWhen*回调被触发之前,您没有初始化资源。

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

答案 1 :(得分:0)

ServiceCore:ServiceBase

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

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