C# 在进程终止后使MemoryMappedFile保持活动状态

C# 在进程终止后使MemoryMappedFile保持活动状态,c#,memory-mapped-files,C#,Memory Mapped Files,在进程终止后,是否可以保持MemoryMappedFile处于活动状态? 例如,我想创建一个MemoryMappedFile一次,然后在不同的进程中使用它。这些进程可以终止并重新启动,但我希望在这些进程之间同步存储在MemoryMappedFile中的数据。如果您使用实际文件(而不是分割出的虚拟内存)备份数据,则是。否则,不会。只要某个进程有一个打开的句柄(不一定是创建它的进程),文件映射就会一直存在,但如果所有进程都终止并且不再有句柄,那么文件映射就会失效。因此,要做到这一点:MemoryMa

在进程终止后,是否可以保持
MemoryMappedFile
处于活动状态?
例如,我想创建一个
MemoryMappedFile
一次,然后在不同的进程中使用它。这些进程可以终止并重新启动,但我希望在这些进程之间同步存储在
MemoryMappedFile
中的数据。

如果您使用实际文件(而不是分割出的虚拟内存)备份数据,则是。否则,不会。只要某个进程有一个打开的句柄(不一定是创建它的进程),文件映射就会一直存在,但如果所有进程都终止并且不再有句柄,那么文件映射就会失效。因此,要做到这一点:MemoryMappedFile.CreateFromFile(…);//创建文件表单
real
file MemoryMappedFile.OpenExisting(…);//然后像@Jeroen Mostert这样使用它,对吗?如果你能指定内存映射文件是何时第一次创建的,那么就可以了。如果是先到先发球,您需要稍微巧妙一些,以避免出现竞争条件:
CreateFromFile
如果映射已经存在,则可能会失败,但是如果映射在两者之间不再存在,则
OpenExisting
仍可能失败。这可能需要在调用
OpenExisting
/
CreateFromFile
的地方创建一个安全的循环,直到没有
FileNotFoundException
为止。出于某种原因,文件备份案例没有
.CreateOrOpen
重载。这就是为什么它是一个文件。不必如此,您可以要求分页文件支持数据。但是,如果它需要生存,那么你就不想要这个选择。实际上,您几乎总是需要一个“服务器”式的管理器进程,这个进程拥有MMF,并且在任何客户机进程崩溃时都可以做一些合理的事情,而不必说再见。非常重要的是,意外的失败是很难处理的,除了受控关闭之外,你几乎什么都做不了。这样服务器就不需要文件了。