2014-02-05 4 views
1

Я бы хотел, чтобы 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() вызывается сразу.

Возможно ли это?

+0

Вы пытались отключить VS Hosting в свойствах вашего проекта? – Jay

+0

хорошая идея! я попробовал это, но теперь он висит в> \t mscorlib.dll! System.Threading.WaitHandle.InternalWaitOne (System.Runtime.InteropServices.SafeHandle waitableSafeHandle, длинные millisecondsTimeout, BOOL hasThreadAffinity, BOOL exitContext) + 0x2b байт \t :( – leozilla

+0

Ctrl + C - довольно большой молот, довольно сложный для кода, чтобы уклониться от него. Вам нужно опубликовать лучшую трассировку стека, чтобы угадать. Остерегайтесь общего тупика в классе Console для RTM .NET 4.5, убедитесь, что у вас есть Windows Update, чтобы получить исправление для него. –

ответ

1

Должна быть возможность перехватывать CTRL + C, добавив обработчик события к событию Console.CancelKeyPress:

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

Я уже пробовал это, он всегда блокируется на "Microsoft.V isualStudio.HostingProcess.HostProc.WaitForThreadExit». – leozilla

+0

Кажется, что это ошибка в .net-среде: http://connect.microsoft.com/VisualStudio/feedback/details/524889/debugging-c-console-application-that-handles-console-cancelkeypress-is-broken -in-net-4-0 – leozilla

+0

@leozilla Да, но кажется, что там только когда вы отлаживаете. Возможно, вы могли бы использовать другую комбинацию клавиш для остановки службы при отладке? Например, я жду нажатия «q», затем я делаю чистое завершение работы. – Luaan

1

Наиболее вероятным виновником является то, что StartService метод вашего сервиса не возвращает управление Topshelf. Что делает ваш StartService? Он должен только инициализировать любые ресурсы и запускать цикл/поток событий. Можете ли вы запустить service install start и запустить его? Если время обслуживания при запуске, это также укрепит идею о том, что ваш старт не возвращается.

0

В VS2010, вам нужно:

  1. Перейти к вашей собственности проекта, затем перейдите на панель «Отладка», отметьте «Включить неуправляемую отладку кода».
  2. Панель инструментов Debug-> Исключения -> затем Снимите флажки с C++ Исключения и исключения Win32.
Смежные вопросы