2009-11-11 3 views
0

HI Guys, Я создал службу Windows, которая порождает три потока. Первая нить просыпается каждые 15 секунд, вторая нить просыпается каждый мин. и третий поток раз в день. Мой код выглядит примерно так:Службы Windows Windows прекратились внезапно

 var timer1 = new Timer(); 
     timer1.Elapsed += ProcessTimerEvent1; 
     timer1.Interval = 60000; 
     timer1.Start(); 

     var timer2 = new Timer(); 
     timer2.Elapsed += ProcessTimerEvent2; 
     timer2.Interval = 15000; 
     timer2.Start(); 

     var timer3 = new Timer(); 
     timer3.Elapsed += ProcessTimerEvent3; 
     timer3.Interval = 86400000; 
     timer3.Start(); 

Из моих журналов событий я могу видеть, что он говорит выполнения .NET 2.0 отчетов об ошибках EVENTID: 5000.

Я просмотрел сеть, и это говорит о недействительной операции.

Вы, ребята, думаете, что эта остановка обслуживания должна что-то делать с помощью потоков. И еще один глупый вопрос: я создаю 3 новых потока каждый раз или те же потоки поднимаются на evey 15 секунд или 1 мин.

ответ

2

Возможно, одна из ваших нитей выбрасывает необработанное исключение. Это позволит вашему процессу немедленно умереть. Убедитесь, что вы обрабатываете какое-либо исключение внутри своих потоков в какой-то момент, обертывая код внутри потока в блоки try-catch (и не забывайте правильно регистрироваться, чтобы вы могли знать о том, что не так).

0

Возможно, это связано с исключением в коде в одном из ваших событий.

0

Вы сохраняете ссылку таймеров на какой-либо глобальный (статический) объект ?. Если они даже не работают, они являются кандидатами на сбор мусора. CG вызовет своих деструкторов, которые, в свою очередь, вызовут метод Dispose, и ваши потоки будут внезапно остановлены.

Для вопроса secons; таймеры используют пул потоков для создания потоков. Каждая обработка будет захватывать поток из пула, использовать его и освобождать. Между периодами они просто ждут уведомления из системных часов.

0

Алиса,

Вы можете добавить обработку исключений Необработанное к вашим услугам с кодом, как это: -

namespace YourNamespace 
{ 
    static class Program 
    { 

     [STAThread] 
     static void Main() 
     { 
      AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; 
      Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException); 
      Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Application.Run(new Form1()); 
     } 

     static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e) 
     { 
      HandleException(e.Exception); 
     } 

     static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
     { 
      HandleException((Exception)e.ExceptionObject); 
     } 

     static void HandleException(Exception e) 
     { 
      //Handle/Log Exception Here 
     } 

    } 
} 

Спасибо,

Phil

http://exceptioneer.com