2011-06-16 42 views
-6

我有,其中包括5個任務main方法的窗口服務:雖然(true)循環陷在Windows服務沒有任何日誌或事件日誌

  • 4 System.Timers.Timer()
  • 1方法與無窮遠環雖然(真)由分隔符螺紋

NB處理:每個方法執行之前,如「發送命令現在開始......」的描述是寫在.log文件

昨天WH我檢查了日誌,我注意到所有4個定時器方法都登錄到日誌文件並執行代碼,但帶有無限循環的方法while(true)什麼也沒有記錄。

你能否給我一些關於什麼會導致無限循環的建議?

private void StartThread(){ 
     if (_Thread != null){ 
      if (_Thread.IsAlive){ 
       return; 
      } 
     } 

     Log.Write("thread started."); 
     _Thread = new Thread(SchedulerWorker); 
     _Thread.IsBackground = true; 
     _Thread.Name = "scheduler thread"; 
     _Thread.Priority = ThreadPriority.Lowest; 
     _Thread.Start(); 
    } 

    private void SchedulerWorker(){ 
     while (true){ 
      try{ 
       DoScheduleWork(); 
      } 
      catch (Exception ex){ 
       Log.Write("Worker exception : " + ex); 
      } 
      Thread.Sleep(TIMER_INTERVAL); 
     } 
    } 
+0

您將需要顯示您的無限循環的代碼,正如讓我們面對它,它的名字確實意味着它會卡住! – BugFinder 2011-06-16 15:41:13

+0

-1:需要更多信息 - 顯示循環的一些代碼將有所幫助。 – 2011-06-16 15:41:41

+0

*「什麼會導致無限循環卡住」*:D ...是否有可能無限循環的線程無法啓動?這似乎是一個明顯的解釋,因爲你說它記錄了第一個動作。另外,它有可能正在緩存寫入日誌文件,因此它會進入無限循環,永遠不會刷新到磁盤(或任何地方)。 – 2011-06-16 15:41:56

回答

1

首先,您需要檢查Log對象的多線程支持。如果它在主線程中工作並不意味着它可以同時在另一個線程中正常工作。在使用多線程時,您總是需要關注併發和其他重要規則。至少,可能是你應該將Log置入lock聲明中(我不知道你的Log對象的內部結構)。

二,不要認爲Log不會拋出異常或異常不存在於catch塊內。很可能是線程崩潰這裏:

catch (Exception ex) 
    { 
     Log.Write("Worker exception : " + ex); 
    } 

三,第一次嘗試simpliest和最安全的日誌記錄您的調試。通常Windows服務將其事件記錄到系統日誌中。但它不太適合調試,它只是服務「接口」的一部分。嘗試使用從System.DiagnosticsTrace類。

using System.Diagnostics; 
... 
    catch (Exception ex) 
    { 
     Trace.WriteLine("Worker exception : " + ex); 
    } 

對於需要更準確地寫,驗證和調試代碼的每一步都認爲它按預期工作之前,多線程應用程序。多數情況下多線程會顯着增加開發的複雜性。

創建服務應用程序也不是一項簡單的任務。例如,強烈建議在服務中使用表單,並使調試複雜化。