2014-01-24 3 views
0

Я написал службы окна, как это:Ловля необработанное исключение Windows Service

public partial class Service1 : ServiceBase 
{ 
    private Thread writerThread; 
    private Thread messageThread; 
    private bool stopNow; 

    public Service1() 
    { 
    } 

    private void MessageThread() 
    { 
     while (stopNow == false) 
     { 
      try 
      { 
       //Do Something 
       Thread.Sleep(10000); 
      } 
      catch (Exception e) 
      { 
       GLogWriter.Write(String.Format("Critical exception {0}. Inner Exception {1} ", e.Message, e.InnerException.Message), LogCategories.Generic, TraceEventType.Critical); 
       OnStop(); 
      } 
     } 
    } 

    private void WriterThread() 
    { 
     bool checkGruppoIndirizzi = true; 

     while (stopNow == false) 
     { 
      try 
      { 
       //Do something else 
       Thread.Sleep(10000); 
      } 
      catch (Exception e) 
      { 
       GLogWriter.Write(String.Format("Critical exception {0}. Inner Exception {1} ", e.Message, e.InnerException.Message), LogCategories.Generic, TraceEventType.Critical); 
       OnStop(); 
      } 
     } 
    } 

    protected override void OnStart(string[] args) 
    { 
     GLogWriter.Write("SERVICE IS STARTING", LogCategories.Generic, TraceEventType.Information); 

     this.stopNow = false; 

     writerThread = new Thread(new ThreadStart(this.WriterThread)); 
     writerThread.Start(); 

     this.messageThread = new Thread(new ThreadStart(this.MessageThread)); 
     this.messageThread.Start(); 
    } 

    protected override void OnStop() 
    { 
     GLogWriter.Write("SERVICE IS STOPPING", LogCategories.Generic, TraceEventType.Information); 
     stopNow = true; 
     writerThread.Join(1000); 
     messageThread.Join(1000); 
     GLogWriter.Write("SERVICE STOP SUCCESSFUL", LogCategories.Generic, TraceEventType.Information); 
    } 
} 

}

Проблема заключается в том, когда я Поймать исключение, видимо, OnStop() не вызывается и сервис быстро останавливается без регистрации сообщений «ОБСЛУЖИВАНИЕ ОСТАНОВКИ»

ответ

1

OnStop() метод не то, что следует называть, когда нить (ы) Вашего остановки работы сервиса. Это специальная процедура, которая должна быть вызвана диспетчером управления сервисом. Другими словами, OnStop() - это процедура, которая должна прекращать обслуживание, когда это необходимо. Что-то вызывает OnStop() -> сервис остановлен. Это не наоборот (что-то происходит внутри службы -> поток (ы) выходят ->OnStop())

+0

спасибо, поэтому я удалю его и просто отпущу нить. – Federico

+1

@Federico, как правило, вы хотите сохранить переопределение 'OnStop()'. Без этого вы теряете способ изящно прекратить обслуживание. 'OnStop()' как опция выхода для приложения GUI. Вы можете удалить его, и пользователю нужно будет убить приложение из диспетчера задач, но, как правило, это не очень хорошая идея. –

1

Пожалуйста, просмотрите журнал событий Windows, чтобы узнать, какую ошибку или исключение вы получаете. Если это программное исключение, определенно это было бы пойманным на улове. Поэтому я подозреваю, что исключение службы исключение на уровне системы.

Это должно быть диагностировано через журнал событий.

0

Это из следующей строки:

GLogWriter.Write(String.Format("Critical exception {0}. Inner Exception {1} ", e.Message, e.InnerException.Message), LogCategories.Generic, TraceEventType.Critical); 

InnerException не всегда является объектом, а это часто null.

Изменение этой строки:

GLogWriter.Write(String.Format("Critical exception {0}. Inner Exception {1} ", e.Message, ((e.InnerException == null) ? string.Empty : e.InnerException.Message)), LogCategories.Generic, TraceEventType.Critical); 
+0

По-видимому, это ничего не меняет, потому что эта строка регистрируется успешно, а innerException не равно null. Проблема в том, что вызов OnStop() не работает. Также я думаю, что вместо этого, используя третичный оператор, эта строка лучше '(e.InnerException ?? string.Emtpy)' – Federico

Смежные вопросы