Я бы хотел, чтобы Topshelf прекратил мое обслуживание, когда я отлаживаю его в консоли.Topshelf в консоли, когда клавиша отмены (CTRL + C) нажата на принудительное прекращение обслуживания
Мой код:
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()
вызывается сразу.
Возможно ли это?
Вы пытались отключить VS Hosting в свойствах вашего проекта? – Jay
хорошая идея! я попробовал это, но теперь он висит в> \t mscorlib.dll! System.Threading.WaitHandle.InternalWaitOne (System.Runtime.InteropServices.SafeHandle waitableSafeHandle, длинные millisecondsTimeout, BOOL hasThreadAffinity, BOOL exitContext) + 0x2b байт \t :( – leozilla
Ctrl + C - довольно большой молот, довольно сложный для кода, чтобы уклониться от него. Вам нужно опубликовать лучшую трассировку стека, чтобы угадать. Остерегайтесь общего тупика в классе Console для RTM .NET 4.5, убедитесь, что у вас есть Windows Update, чтобы получить исправление для него. –