2009-11-11 91 views
0

嗨,夥計們, 我創建了一個窗口服務,它產生了三個線程。第一個線程每15秒喚醒一次,第二個線程每分鐘喚醒一次。和第三個線程每天一次。 我的代碼看起來是這樣的:.NET窗口服務突然停止

 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-blocks中(並且不要忘記正確登錄,以便您能意識到出錯的事情),從而在線程內處理任何異常。

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 
     } 

    } 
} 

感謝,

菲爾

http://exceptioneer.com