目录
写在前面
代码实现
进程A
进程B
进程C
调用示例
总结
写在前面
多个进程之间,通过操作未映射到磁盘上现有文件的内存映射文件,可以实现数据共享和类似进程间通讯的功能。以下示例展示了使用三个独立进程,先各自将布尔值写入内存映射文件,然后再由其中一个全部读取出来的功能;示例代码主要来自微软官方教程。
代码实现
进程A
using System.IO.MemoryMappedFiles;Console.WriteLine("我是独立进程A");using MemoryMappedFile mmf = MemoryMappedFile.CreateNew("test_mem_map_file", 10000);bool mutexCreated;
Mutex mutex = new Mutex(true, "testmapmutex", out mutexCreated);
using (MemoryMappedViewStream stream = mmf.CreateViewStream())
{BinaryWriter writer = new BinaryWriter(stream);writer.Write(1);
}
mutex.ReleaseMutex();Console.WriteLine("请启动进程 B 并按下确认键以继续运行.");
Console.ReadLine();Console.WriteLine("请启动进程 C 并按下确认键以继续运行.");
Console.ReadLine();mutex.WaitOne();
using (MemoryMappedViewStream stream = mmf.CreateViewStream())
{BinaryReader reader = new BinaryReader(stream);Console.WriteLine("进程 A 写入的内容: {0}", reader.ReadBoolean());Console.WriteLine("进程 B 写入的内容: {0}", reader.ReadBoolean());Console.WriteLine("进程 C 写入的内容: {0}", reader.ReadBoolean());
}
mutex.ReleaseMutex();Console.ReadLine();
进程B
using System.IO.MemoryMappedFiles;Console.WriteLine("我是独立进程B");try
{using MemoryMappedFile mmf = MemoryMappedFile.OpenExisting("test_mem_map_file");Mutex mutex = Mutex.OpenExisting("testmapmutex");mutex.WaitOne();using (MemoryMappedViewStream stream = mmf.CreateViewStream(1, 0)){BinaryWriter writer = new BinaryWriter(stream);writer.Write(0);}mutex.ReleaseMutex();
}
catch (FileNotFoundException)
{Console.WriteLine("内存映射文件不存在. 请先运行进程A.");
}
进程C
using System.IO.MemoryMappedFiles;Console.WriteLine("我是独立进程C");try
{using MemoryMappedFile mmf = MemoryMappedFile.OpenExisting("test_mem_map_file");Mutex mutex = Mutex.OpenExisting("testmapmutex");mutex.WaitOne();using (MemoryMappedViewStream stream = mmf.CreateViewStream(2, 0)){BinaryWriter writer = new BinaryWriter(stream);writer.Write(0);}mutex.ReleaseMutex();
}
catch (FileNotFoundException)
{Console.WriteLine("内存映射文件不存在. 请先运行进程A,再运行进程B.");
}
调用示例
总结
总的来说,一番体验下来,采用内存映射文件来做进程间的资源共享或状态同步还是很简便的。