2012-08-15 96 views
1

我有一個應該運行24 * 7 * 365的C#4.0 Windows控制檯應用程序。 (我有一個Windows服務來監視這個應用程序,並且如果它由於某種原因而終止,就啓動它)。此控制檯應用程序的啓動涉及一些複雜的資源消耗活動 - 所以我必須確保不會頻繁重新啓動控制檯應用程序。控制檯應用程序有3個System.Timers.Timer實例,它們在計時器過去時執行一些活動(時間間隔分別爲10秒,15秒和2小時)。什麼纔是正確的方法來防止控制檯應用程序終止,並保持活着?有人可以請建議!防止終止控制檯應用程序

+0

你現在還活着嗎?當然你有一個循環? 'while(true)Console.ReadKey()'是否足夠? – 2012-08-15 07:40:42

+1

你需要說明是什麼導致它在第一個地方終止 – 2012-08-15 07:40:54

+9

我不得不問:你*真*有一個*服務*來監視和啓動*永遠在運行的控制檯* ...?你爲什麼不把代碼**移入服務**(因爲你描述的是服務的行爲) – 2012-08-15 07:42:23

回答

2

從你已經在你的意見,你有一個控制檯應用程序的唯一理由說所以你可以閱讀調試信息。這個答案將離開這個假設。

控制檯應用程序不夠可靠,無法做你想做的事情,有很多情況下你會遇到應用程序不會啓動或可能啓動多次(如果沒有人登錄,你會怎麼做?如果多人登錄,你會怎麼做?)

要做的最好的事情就是把這個密集型操作寫成服務,然後把輸出到控制檯的任何診斷信息都輸入到事件日誌中或者把它放到調試器中。

如果你想寫一條消息到應用程序事件日誌,你所需要做的就是將你的信息寫入this.EventLog.WriteEntry(message)。這將在應用程序事件日誌中爲您的服務生成一個信息事件。如果您想將嚴重程度提高到警告或錯誤,則只需使用the other overload即可。

如果你想寫入與應用程序不同的日誌(比如你自己的日誌),你將需要服務的installer創建你需要的任何源/日誌(如果你需要幫助,請提出一個新問題) 。然後在您的服務中將AutoLog設置爲false,然後創建自己的指向新日誌的事件日誌實例。

如果您想要在診斷問題時才顯示的日誌,最簡單的解決方案是將您的Console.WriteLine(message)語句更改爲Debugger.Log(1, "DebugLogging", message + Environment.NewLine)。這會導致您的消息在運行時連接到服務時顯示在「調試」輸出窗口中(您知道如何連接到服務以在其上運行調試器嗎?如果沒有問一個新問題它)。我不會推薦使用Debug.WriteLine(message),除非您在發佈模式下構建時從不打算進行診斷。這是因爲Debug.WriteLine具有屬性[Conditional("DEBUG")]。這是因爲只有在編譯期間DEBUG標誌被設置時,該函數纔會被執行,並且Release沒有設置該標誌。


如果你想有一個更強大的解決方案,我建議學習如何使用log4net這是簡單的解決方案。 Log4net可以讓你完成以上所有工作,還有更多。例如,您可以控制通過配置文件寫入事件日誌的多少(程序甚至不需要重新啓動以使用新設置開始記錄,它會檢測您何時執行保存。)

這樣您可以將詳細日誌消息放入代碼中,但只需通過更改XML配置文件中的一個設置即可在需要時將其打開。

如果您對設置兩個頂級建議中的任何一個或設置log4net有任何疑問,請隨時就這些主題提出新問題。

+0

謝謝,我已經在使用Log4Net了。現在我已經將這個完整的功能作爲服務來實現。 – Thomas 2012-08-16 02:11:44

1

您可以簡單地使用Console.ReadLine()使控制檯保持活動狀態。但Windows服務可能是你想要的。

1

while (Console.ReadLine() != "I really want to stop this application") { }或類似的東西?

的類似應用思維(如我的世界......),你就會有一個循環,如以下幾點:

string command; 
Console.Write("> "); 
while ((command = Console.ReadLine()).ToUpper() != "STOP") 
{ 
    // Do something else based on the command 
    ... 

    Console.Write("> "); 
} 
+0

由於控制檯應用程序是從Windows服務中觸發的,因此我不會看到控制檯應用程序停止它 - 這意味着基本上沒有桌面交互。 – Thomas 2012-08-15 07:51:30

+0

在這種情況下,我必須使用「運行服務中的代碼」。 – Rawling 2012-08-15 08:02:21