2011-04-28 29 views
0

我有一個隨installutil.exe一起安裝的.NET 2.0窗口服務。該服務的功能是一個批處理服務,該服務遍歷輸入文件並處理每個記錄並保存輸出文件。當我在Windows服務中啓動服務時,20秒後它說服務沒有響應,所以它停止服務,但是我可以從輸出文件中看到服務運行良好。 我收到的確切消息是:錯誤1053:服務沒有及時響應啓動或控制請求。.NET Windows服務說,即使我知道它正在運行,但沒有響應

我通過註冊表黑客增加了Windows服務超時,但它產生了相同的結果(唯一的區別是接收「無響應」消息需要更長的時間)。

我服務的OnStart方法如下:

protected override void OnStart(string[] args) 
{ 
    Producer producer = new Producer(); 
    ThreadStart st = new ThreadStart(producer.Produce); 
    workerThread = new Thread(st); 
    workerThread.Start(); 
} 

static void Main() 
{ 
    System.ServiceProcess.ServiceBase[] ServicesToRun; 
    ServicesToRun = new System.ServiceProcess.ServiceBase[] { new BatchService() }; 
    System.ServiceProcess.ServiceBase.Run(ServicesToRun); 
} 

生產者構造:

public Producer() 
{ 
    nMaxConcurentJobs = int.Parse(ConfigurationManager.AppSettings["MaxConcurentJobs"]); 
    if (ConfigurationManager.AppSettings[TIME_INTERVAL] != null)` 
    { 
      sleepTime = int.Parse(ConfigurationManager.AppSettings[TIME_INTERVAL]); 
      sleepTime *= 1000; 
    } 
} 

有什麼我需要通知窗口服務,它的工作?任何幫助將不勝感激,我一直在努力這個好幾天了!

+0

你也可以發佈你的'Main'和'Producer'構造函數嗎? – Brook 2011-04-28 14:16:44

+0

我貼了他們.. – Alex 2011-04-28 14:31:16

+0

我沒有看到一個罪魁禍首,我建議張貼@Steve Townsend建議您的'BatchService'的構造函數。你有一些重要的事情發生在不應該的地方,只需要找到它。 – Brook 2011-04-28 15:18:32

回答

1

確保OnStart通過讓它進行某種日誌輸出來調用。

請確保您在ServiceBase衍生的類構造函數中沒有做很多工作,OnStart是進行繁重工作的地方。

如果您的啓動邏輯持續時間很長,您可能需要撥打RequestAdditionalTime來防止服務控制管理器(SCM)假設您的進程已經死亡。當您從OnStart返回時,SCM將在服務GUI中將您的服務標記爲「正在運行」。

設計您的應用程序,以便它可以不作爲服務運行,以確保您沒有在該多線程啓動代碼中發生死鎖。將適當的診斷輸出添加到該邏輯以跟蹤其進展。

+0

我有日誌文件,它顯示所有工作正常。我發佈了我的OnStart方法,正如你所看到的,它所做的只是創建一個新的線程。 – Alex 2011-04-28 14:28:12

0

我沒有看到關於Producer.Produce()任何地方的任何細節,但我注意到似乎是一個叫sleepTime的成員。你在使用Thread.Sleep()嗎?如果是這樣,你有嘗試過使用Monitor還是Timer

相關問題