2011-02-11 150 views
0

我有一個Windows服務,無論用戶何時向它發送一些數據,都會調用一些沉重的圖像處理。因此,如果有多個數據,則數據將排隊並按順序處理。然而有時候處理數據可能會折騰,並且處理過程會永遠停留在那裏。還不確定爲什麼會發生。發生這種情況時,我希望自己重新啓動服務器,以便在服務重新啓動時從隊列中取出下一個服務器。我的問題是重啓服務本身是一個好主意嗎?你甚至可以這樣做,還是有其他方法可以做到這一點?本身重新啓動Windows服務

Sapna的

+0

如果服務掛起,它應該如何重新啓動? – Oded 2011-02-11 10:01:17

回答

0

如俄德在他的評論中說,如果服務已掛起,它不能重新啓動。如果你能弄清楚它爲什麼會掛起並且完全停止它,那麼最好,但是假設由於某種原因這是不可能的。

我能想到的兩個選擇是,如果圖像處理是在一個線程中完成的,而且只有那個掛起的線程,那麼你可能會有一個單獨的「監視」線程,保持檢查處理線程仍然很快樂,否則它會殺死它並重新啓動它。或者,如果整個服務掛起,您可以有一個單獨的監視服務,即檢查和重新啓動。

+0

嗯,是的..完成了。我使用超時檢查服務是否處理卡住。這是在服務本身完成的。但是我希望在下一個數據被處理之前重新啓動服務,以確保先前的處理錯誤不會破壞內存並影響下一次處理。因此,一旦我檢測到處理已崩潰,在服務中使用Environment.Exit會是明智的嗎?這是一項自動服務,所以它會在一分鐘後自行重啓?還有其他建議嗎? – Sapna 2011-02-11 11:11:09

+0

@Sapna:如果我想做類似你說的話,那麼我會創建一個控制處理的服務,並讓該服務創建一個新的進程來完成實際的處理。這樣,您可以讓服務始終保持運行狀態,而不必擔心服務會掛起,並且服務可以輕鬆監視處理進程是否已退出(可能由於掛起而退出),並且可能只是啓動另一個實例。像你所建議的那樣讓服務*退出*感覺不對。 – 2011-02-11 15:45:45

0

你有三個任務:

  1. 檢測服務卡: 這可以用不同的方式來完成,第一個是使用超時
  2. 重新啓動服務: 可以通過完成單獨的監控服務,或者使用相同的服務不同的服務實例之間
  3. 手柄任務隊列的另一個線程: 你需要你的任務隊列序列化到磁盤,這樣當重新啓動服務能夠繼續處理隊列