.Net 利用MemoryMappedFile实现进程间相互通信
在.NET中有这样一个类MemoryMappedFile,顾名思义:内存文件映射.
这个类可以很方便的将硬盘中的物理文件,映射到内存中,操作文件时,就可以直接从内存中读取写入了。省去了磁盘转入内存,内存转磁盘的操作时间,效率当然也是更高。
这适合用于大文件频繁的读写,效果比较显著。
除了从已有的物理文件加载数据源(MemoryMappedFile.CreateFromFile),也支持在内存中直接创建数据(MemoryMappedFile.CreateOrOpen),
直接在内存中创建数据并保留.并且这段内存是特殊的,是可以共享的,即:共享内存。
在同一台PC,运行的软件(进程),系统都会给其分配一段内存供其调度运行.每个进程独占这段内存,互不干扰。那么共享内存,就好比一个公共区域,
每个进程都可以申请,使用。MemoryMappedFile正是具有这个特性,所以可以实现进程间的相互通信.
在同一PC种,利用它实现进程间通信,是非常方便且高效的!
这里自己做了个简单DEMO,旨意阐述MemoryMappedFile具有实现进程间通信的功能.
完整代码如下:

1 using System; 2 using System.Collections; 3 using System.Collections.Generic; 4 using System.Collections.Specialized; 5 using System.Linq; 6 using System.Net; 7 using System.Net.Sockets; 8 using System.Text; 9 using System.Threading; 10 using System.Threading.Tasks; 11 using System.Net.NetworkInformation; 12 using System.IO; 13 using System.IO.Compression; 14 using ICSharpCode.SharpZipLib.Zip; 15 using System.IO.MemoryMappedFiles; 16 using System.Runtime.InteropServices; 17 18 namespace ConsoleApplication3 19 { 20 class Program 21 { 22 static void Main(string[] args) 23 { 24 Console.WriteLine("注: w:写 r:读"); 25 while (true) 26 { 27 string ac = Console.ReadLine(); 28 29 if (ac == "w") 30 { 31 Console.WriteLine("请输入存入内容:"); 32 string content = Console.ReadLine(); 33 if (!string.IsNullOrEmpty(content)) 34 { 35 WriteMMF("mmf001", content); 36 } 37 else { 38 Console.WriteLine("存入内容不能为空!"); 39 } 40 } 41 else if (ac == "r") 42 { 43 ReadMMF("mmf001"); 44 } 45 else { 46 47 Console.WriteLine("注: w:写 r:读"); 48 } 49 } 50 51 } 52 /// <summary> 53 /// 写入映射文件 54 /// </summary> 55 /// <param name="mapname"></param> 56 /// <param name="content"></param> 57 static void WriteMMF(string mapname,string content) { 58 59 MemoryMappedFile mmf = MemoryMappedFile.CreateOrOpen(mapname,1000, MemoryMappedFileAccess.ReadWrite); 60 if (!string.IsNullOrEmpty(content)) 61 { 62 using (var mmfStream = mmf.CreateViewStream()) 63 { 64 using (var sw = new StreamWriter(mmfStream)) 65 { 66 sw.Write(content.Trim()); 67 } 68 } 69 70 Console.WriteLine("保存成功!"); 71 } 72 } 73 74 /// <summary> 75 /// 读取映射文件 76 /// </summary> 77 /// <param name="mapname"></param> 78 static void ReadMMF(string mapname) 79 { 80 MemoryMappedFile mmf = MemoryMappedFile.OpenExisting(mapname); 81 using (var mmfStream = mmf.CreateViewStream(0,1000, MemoryMappedFileAccess.ReadWrite)) 82 { 83 byte[] buffer = new byte[128]; 84 int nLength = 0; 85 StringBuilder sb = new StringBuilder(); 86 do 87 { 88 nLength = mmfStream.Read(buffer, 0, 128); 89 sb.AppendLine(System.Text.ASCIIEncoding.Default.GetString(buffer)); 90 91 } while (nLength > 0); 92 93 Console.WriteLine("读取内容:" + sb.ToString().Replace("\0", null).TrimEnd()); 94 } 95 Console.WriteLine("读取成功!"); 96 } 97 98 } 99 100 101 102 }
测试效果图:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~