当取消键(CTRL + C)按下强制停止服务时,Topshelf在控制台中

时间:2014-02-05 08:24:20

标签: c# .net topshelf

我希望Topshelf在我在控制台中调试时停止我的服务。

我的代码:

public class Program
{
    private static ILog _log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

    public static void Main(string[] args)
    {
        HostFactory.Run(Configure);
    }

    /// <summary>
    /// Configures the service host.
    /// </summary>
    /// <param name="cfg">The HostConfigurator</param>
    private static void Configure(HostConfigurator cfg)
    {
        try
        {
            cfg.Service<ServiceHost>(s =>
            {
                s.ConstructUsing(name => new ServiceHost());
                s.WhenStarted(host => host.StartService());
                s.WhenStopped(host => host.StopService());
            });

            cfg.RunAsLocalSystem();
            cfg.StartManually();
            cfg.SetDisplayName(DisplayName);
            cfg.SetServiceName(ServiceName);
            cfg.UseLog4Net();
        }
        catch (Exception ex)
        {
            _log.Fatal("Exception on Startup", ex);
            throw;
        }
    }
}

但是当我按 CTRL + C 时,它会挂起Microsoft.VisualStudio.HostingProcess.HostProc.WaitForThreadExit

当我按 CTRL + C 时,我希望立即调用host => host.StopService()

这可能吗?

5 个答案:

答案 0 :(得分:2)

应该可以通过向Console.CancelKeyPress事件添加事件处理程序来拦截CTRL + C:

Console.CancelKeyPress += (s, e) => host.StopService();

答案 1 :(得分:1)

最可能的罪魁祸首是您的服务的StartService方法不会将控制权返还给Topshelf。你的StartService做了什么?它应该只初始化任何资源并启动你的事件循环/线程。你可以运行service install start并让它启动吗?如果服务在启动时超时,那么它也会强化你的开始没有返回的想法。

答案 2 :(得分:0)

它是.NET 4.0的一个已知错误,有一个解决方法,但它讨厌的

https://github.com/Topshelf/Topshelf/issues/10

答案 3 :(得分:0)

在VS2010中,您需要:

  1. 转到项目属性,然后导航到“调试”窗格,选中 '启用非托管代码调试'。
  2. 工具栏调试 - &gt;例外 - &gt; 然后取消选中C ++ Exceptions和Win32 Exceptions。

答案 4 :(得分:0)

在ServiceHost类中实现IDisposeable,添加Dispose方法,并处理所有线程对象。