2010-09-16 52 views
7

我即將在C#中開發Windows服務。該服務需要跟蹤系統中的事件,並不時向文件寫入一些數據。這些正在進行的事件會形成一定的狀態,所以我會將狀態保存在內存中,並在事件到達時進行更新。我不想讓事情過分複雜化,所以我不希望狀態在磁盤上持久化,但是我想知道是否我可以以某種方式使它在內存中持久化,以便如果服務崩潰(並且自動重新啓動Windows),它可以從它離開的地方繼續前進(可能會失去一些事件,而不是一個大問題)。我正在考慮創建一個「共享」內存區域,從而讓Windows管理它,並僅在服務中使用它 - 但我不確定在服務死後該對象會持續存在。將持久數據保存在內存中

任何想法?

編輯:我不是在尋找一種矯枉過正的解決方案。數據有點重要,所以我想保持它在內存中等待,直到服務重新啓動,但數據不是重要。如果我可以輕鬆地保存數據,而無需使用文件,外部第三方進程等,那麼它更像是一個很好的功能。我的理想解決方案是一個簡單的內置功能(在.NET或Windows中),它將爲我提供一些內在的持久性,以便從崩潰事件中恢復。

+0

結帳:['PersistentDictionary'](http://izlooite.blogspot.com/2011/04/persistent-dictionary.html)class – 2011-04-19 08:54:28

回答

3

您可以使用來自Microsoft Enterprise Library的Persitent緩存塊。

它是可配置的,您可以使用許多後備商店,如數據庫和獨立存儲。

+0

不錯,這看起來很有趣,謝謝! – 2010-09-16 08:27:05

0

如何使用獨立存儲並以此方式將對象保存到內存中?

+0

您可否詳細說明「隔離存儲」? – 2010-09-16 07:57:01

+1

查看鏈接http://ondotnet.com/pub/a/dotnet/2003/04/21/isolatedstorage.html – Madeleine 2010-09-16 08:08:10

+0

感謝您豐富我的知識。但是,這也寫入文件 - 我沒有任何權限問題,所以隔離存儲不會增加我的情況的價值。 – 2010-09-16 08:32:00

2

您可以使用Memcached或Redis(它也將其數據保留在磁盤上,但會自動處理它)。

http://code.google.com/p/redis/

你也可以看看這個問題:

Memcached with Windows and .NET

+1

Memcached和Redis的確很有趣,但我有一種感覺,他們會過度殺傷。我只需要像幾個對象那樣存儲幾個字符串和整數。我可以用磁盤交互來完成,但我更喜歡內存交互,原因很明顯。我在.NET或Windows中尋找內置功能。 – 2010-09-16 08:02:34

+0

那麼,你可以嘗試一下,然後決定你的感覺是否正確......無論如何,jmservera的建議使用Persistenc緩存塊可能是一個很好的選擇。 – mamoo 2010-09-16 08:12:14

0

即使,例如,你繼續一些其他聯網的PC的共享內存中的數據,你將如何「保證」聯網電腦不會掛/重啓/暫停/ etc?在這種情況下,您的服務無論如何都會丟失持久數據。

我會建議,而且你很有可能最終將數據存儲在同一張磁盤上。

請注意,由於內存(RAM)的易失性,您無法在系統重新啓動之前重新載入以前存在的數據;除非您使用某種機制來存儲/重新加載磁盤。

- 編輯 -

在這種情況下,如何使用MSMQ?因此,您可以將所有內容都推送到隊列中,即使您的服務重新啓動,它也會查找隊列中的項目並繼續向前。

+0

如果同一臺PC重新啓動,我不再需要持久數據。我只想說明我的服務崩潰並自動重新啓動的極端情況。 – 2010-09-16 07:58:59

+0

@Eldad:請參閱我的編輯以迴應您的評論。 – 2010-09-16 09:34:28

1

我不明白爲什麼它會更難堅持到磁盤。使用db4o可以保留已經使用的實例。

+0

堅持到磁盤並不難。我的數據非常簡單,我可以輕鬆地將它序列化到文件和從文件中序列化,我只是想盡可能避免與磁盤混淆。數據並不那麼重要;如果我可以使用它,但在服務不幸重新啓動時的短時間內保持內存安全(更安全......),那將非常棒。 – 2010-09-16 08:04:59

+0

可以處理預期的故障情況,避免不必要地使用自動重啓,並且在極端情況下忽略它仍然崩潰/因爲您已經說過,如果該框重新啓動,您不會關心丟失數據。 – eglasius 2010-09-16 08:11:46

+0

那麼,這是希望最好的:-)顯然,我不會像代碼一樣,不關心服務是否能夠存活。我會盡我所能保持它,但仍然...但我需要權衡持續數據的成本。 – 2010-09-16 08:29:02

3

我知道你說你不想過度複雜的東西持續到磁盤,但它肯定會更復雜的東西到共享內存或這裏列出的任何解決方案。這麼多應用程序使用數據庫或文件存儲的原因是因爲它是最簡單的解決方案。

我建議您將所有狀態保存在單個對象或對象層次結構中,將此對象序列化爲XML並將其寫入文件。它確實沒有那麼簡單。

+0

我想你是對的。我的思路是 - 這不是一個非常重要的數據,我可以忍受失去它。如果我可以在我的代碼中調整某些內容,使其在服務停止和備份時保持不變,而不會進行太多改變,我希望這樣做。 – 2010-09-16 08:24:25

+1

是的,我不認爲你真的有這個選擇。您可以定期將其寫入磁盤,但在服務關閉之前無法保存它 - 例如,如果服務器崩潰,則已經太遲了 – 2010-09-16 08:39:41

相關問題