在进程之间同时共享内存映射

时间:2014-08-01 06:19:37

标签: c# ipc memory-mapped-files

在克服了其他一些困难之后,我现在仍然坚持这个(可能是简单的)问题。

我的目标:

  • 我的应用程序的多个实例正在运行并正在执行 同一文件同时
  • 上的操作(读取和写入)
  • 解决方案(我想做的):使用内存映射文件来加速 执行。当应用程序启动时,它会尝试调用CreateFromFile() (据我所知,如果该文件已被某人映射过 否则,这将只会返回“句柄”,然后继续 在文件上执行其工作。

问题是,当另一个进程已经完成并且没有处理The file is being used by another process对象时,我在尝试CreateFromFile()时遇到IOException(MemoryMappedFile)。理论上,我可以使用互斥锁并使用using语句不断处理对象,但是将内容转储到磁盘,再次降低执行速度并使目的失效。

我的问题有哪些可行的解决方案?

理论上,我可以将CreateOrOpen()作为非持久文件,然后在需要时将其转储到磁盘,但我相信有更好的方法吗?

编辑:我觉得我没有说清楚。应用程序的所有实例都需要不断处理文件,打开它并在接下来的10,20,60分钟内使用它而不关闭文件。最终所有这些都将被杀死,当操作系统介入时,将地图文件刷新到磁盘。

示例程序:

计划A)

static void Main(string[] args)
    {
        var mmf = MemoryMappedFile.CreateFromFile(@"C:\Users\admin\Documents\Visual Studio 2010\Projects\serialize\serialize\bin\Debug\File.dat", FileMode.Open, "name");
        var accessor = mmf.CreateViewAccessor();
        accessor.Write(5, 'd');
        Console.Read();
    }

计划B)

static void Main(string[] args)

{
    var mmf = MemoryMappedFile.CreateFromFile(@"C:\Users\admin\Documents\Visual Studio 2010\Projects\serialize\serialize\bin\Debug\File.dat", FileMode.Open, "name");
    var accessor = mmf.CreateViewAccessor();
    accessor.Write(2, 'x');
    Console.Read();
}

我同时运行两个,让他们等待Console.Read()。理想情况下,它们应该能够同时访问该文件(即它们都可以在另一个文件之后打开它),但如上所述,我收到了IOException。

0 个答案:

没有答案