2010-06-17 54 views
1

在我創建的應用程序中,我有兩個組件,我希望用戶能夠暫停/恢復。我想知道可能存在哪些標準模式來支持暫停和恢復,如果有的話?這兩個組件都執行大量的網絡I/O。看起來,在高層次上,我必須堅持每個組件都有的當前工作隊列 - 但是堅持它是我尋找這些標準模式的地方?我是否要序列化組件本身?我只是序列化工作?我可以序列化到什麼格式(xml,數據庫等)? .NET內置了什麼可能會有所幫助?有沒有任何圖書館可以提供幫助?如果用戶在同一個應用程序會話中暫停/恢復,或者在打開,關閉然後再次打開應用程序後暫停/恢復,是否有任何區別需要考慮?如何在不同的計算機上保存這些信息?C# - 如何實現暫停/恢復語義?

從過去的經驗或模式想到的任何建議?我希望這會變成更多討論這種做法的各種方式以及每種做法的利弊。謝謝。

+0

你只是暫停組件之間的通信,「工作」會不斷積累,還是工作也暫停?如果暫停的工作需要終止應用程序,它肯定會有所作爲。消息隊列將允許您累積工作(消息)而沒有丟失應用程序終止的風險,但可能是比所需更重的解決方案。 – ScottS 2010-06-17 18:09:56

+0

Scott - 不,應用程序暫停時工作不會累積。你能否解釋一下,如果應用程序終止,消息隊列將如何生存?也許提供關於你所指的這個消息隊列結構的更多細節?我的兩個組件都已經有工作隊列,但如果應用程序關閉,它們將無法生存。謝謝。 – Chad 2010-06-17 18:14:42

回答

1

通過消息隊列我的意思是MSMQ或其中的一個弟兄。所有消息都會保存在某種數據庫中,因此應用程序重新啓動時仍然可用。這樣的隊列的主要目的是確保即使在通信間歇和/或不可靠時也能傳遞消息。

這聽起來像你可以讓你的通信組件從MSMQ而不是你目前的隊列很容易地工作。

如果這不適合您的應用程序,它可能與在終止時序列化現有隊列中的對象並在應用程序啓動時重新將其解序列化一樣簡單。如果倖存的意外終止非常重要,那麼應該在對象添加到工作隊列時始終序列化一個對象,但此時可能需要再次查看現有的消息隊列系統。

+0

謝謝Scott!它看起來像MSMQ將照顧我的需求。 – Chad 2010-06-18 02:32:33

-1

您可以實現線程並簡單地在線程上調用Suspend()和Resume()函數。

+0

這些方法都是折舊的,並且不適用於跨應用程序會話(例如打開應用程序,開始工作,暫停工作,關閉應用程序,打開應用程序,恢復)。 – Chad 2010-06-17 18:08:54

+0

除了乍得的評論,暫停和恢復方法是一個非常糟糕的主意,因爲他們不會很好地處理網絡I/O。您不僅要暫停,還要暫停協議順序中的正確位置,並在必要時維護任何保持活動狀態。 – 2010-06-17 18:20:31

+0

我明白了,http://stackoverflow.com/questions/142826/is-there-a-way-to-indefinitely-pause-a-thread可能會說明一些問題。 – 2010-06-17 18:20:32