2012-01-20 190 views
1

客戶端應用程序啓動服務器上的進程(通過RIA,但實現並不重要)。當我說過程時,我的意思是業務代碼正在運行,而不是指在CPU上運行的實際過程。在C#中檢查服務器操作狀態。檢查服務器進程的狀態(業務操作)

代碼是C#。

客戶端然後檢查以查看進程狀態。失敗,已完成,仍在運行。

基礎相對容易實現。我在服務器上靜態存儲進程標識,客戶端可以定期輪詢服務器以檢查將檢查與進程標識關聯的狀態的進程。

圍繞這個邊緣案例需要更多的工作。致命的和災難性的原因,異常中止線程(進程),而不允許代碼處理異常並優雅地設置與進程關聯的狀態失敗。在這種情況下,客戶將繼續假定該過程仍在進行中。

我想在單獨的線程中運行進程並跟蹤線程ID。當客戶端調用服務器來檢查進程狀態時,我們可以檢查運行進程的線程的IsAlive屬性。

我想知道是否有任何情況下,這可能是有問題的?也許有可能IsAlive會返回True,儘管線程被掛起。

另一種方法是讓服務器上的進程定期設置一個時間戳,可以在客戶端檢查狀態時使用該時間戳。檢查狀態的代碼可以看到時間戳的年齡,然後根據我們選擇的任何時間間隔(假設2分鐘),它可以決定進程是否仍在運行(自上次時間戳寫入以來還沒有超過2分鐘),或者進程沒有例外的超時(自線程寫入最後一個時間戳以來已超過2分鐘)。所有的時間戳都會在內存中完成。

圍繞此可能有什麼最佳做法嗎?有沒有人有任何特別的見解或提示如何最好地處理這個問題?我也開放給其他場景或想法的人有?

+0

此外,請注意,這通常是一個長時間運行的操作,具有許多代碼步驟。服務器進程可能需要一個小時或更多才能完成。 – user1060500

+0

您可以與消息傳遞系統[Keep Alive](http://en.wikipedia.org/wiki/Keepalive)術語並行,以便每個正在運行的業務流程(BP)知道發送其KeepAlive消息,指示其運行狀態。爲了避免高網絡負載,你可以發送KA消息給本地監聽器,這將收集統計數據,只要監聽器是一個單獨的進程,你提供的時間戳方案就可以很好地工作,但是你應該考慮如何在監聽器掛起時覆蓋這些情況。 – sll

回答

0

我相信更好的方法是擁有一個完全控制的服務器應用程序,該應用程序處理包括每個業務流程異常在內的所有事情,並維護所有狀態。如果客戶端收到StateChanged事件而不是輪詢(例如使用WCF雙工信道),情況會更好。基本上你做的是1999年。 .NET爲你提供了幾乎免費的所有東西。正確的架構實際上可以更快地寫入,並且時間更便宜。