我希望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()
。
这可能吗?
答案 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的一个已知错误,有一个解决方法,但它讨厌的
答案 3 :(得分:0)
在VS2010中,您需要:
答案 4 :(得分:0)
在ServiceHost类中实现IDisposeable,添加Dispose方法,并处理所有线程对象。