我即将在C#中开发Windows服务。此服务需要跟踪系统中的事件,并不时将一些数据写入文件。这些正在进行的事件形成一定的状态,因此我会将状态保留在内存中并在事件到达时更新它。我不想让事情过于复杂,所以我不希望状态在磁盘上持久化,但我想知道我是否能以某种方式使其在内存中持久化,以便在服务崩溃时(并且自动重启Windows)它可以从它离开的地方继续前进(可能会丢失一些事件,而不是什么大不了的事)。
我正在考虑创建一个“共享”内存区域,从而让Windows管理它,并仅在服务中使用它 - 但我不确定该服务在服务终止后是否会持续存在。
有什么想法吗?
编辑:我不是在寻找一个矫枉过正的解决方案。数据有点重要,所以我想让它在内存中等待,直到服务重新启动,但数据太重要。如果我可以轻松地持久保存数据,而不使用文件,外部第三方进程等等,那么这将是一个很好的功能。我理想的解决方案是一个简单的内置功能(在.NET或Windows中),它将为我提供一些内存持久性,只是为了从崩溃事件中恢复。
答案 0 :(得分:3)
您可以使用Microsoft Enterprise Library中的持久性缓存块。
它是可配置的,您可以使用许多后备存储,如数据库和隔离存储。
答案 1 :(得分:3)
我知道你说你不想通过将它保存到磁盘来使事情过于复杂,但将内容保存到共享内存或此处列出的任何解决方案中肯定会更加复杂。许多应用程序使用数据库或文件存储的原因是因为它是最简单的解决方案。
我建议您将所有状态保存在单个对象或对象层次结构中,将此对象序列化为XML并将其写入文件。它确实没有那么简单。
答案 2 :(得分:2)
答案 3 :(得分:1)
我不明白为什么坚持磁盘会更难。
使用db4o,您可以保留已经使用过的实例。
答案 4 :(得分:0)
如何使用独立存储并将对象持久存储到内存中?
答案 5 :(得分:0)
例如,即使您将数据保存在其他联网的PC 的共享内存中,您如何“保证”联网的PC 不会挂起/重启/停止/等?在这种情况下,您的服务无论如何都会丢失持久数据。
我建议,你很可能最终将数据存储在同一个磁盘上。
请注意,由于内存(RAM)的易失性,您无法在系统重新启动之前重新加载以前存在的数据;除非您使用某种机制在磁盘上存储/重新加载。
<强> - 编辑 - 强>
在这种情况下,如何使用MSMQ?因此,您可以将所有内容推送到队列中,即使您的服务重新启动,它也会查找队列中的项目并继续进行。