2010-09-16 61 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