调用MemoryMappedFile.OpenExisting抛出FileNotFoundException的问题排查
问题原因及解决方案
核心原因
第一个using语句块创建的MemoryMappedFile实例,在代码执行完该块后会被自动销毁:using语法会在代码块结束时调用对象的Dispose()方法,释放内存映射文件的系统资源,对应的命名内存映射对象也就不存在了。此时第二个using块尝试通过OpenExisting打开同名的内存映射文件,自然会因找不到目标而抛出System.IO.FileNotFoundException。
修复方案
如果是单进程内的读写操作,只需将读写逻辑放在同一个MemoryMappedFile的生命周期内即可:
using (MemoryMappedFile mmFile = MemoryMappedFile.CreateNew("Raise", 1000)) { // 写入操作 using (MemoryMappedViewAccessor accessor = mmFile.CreateViewAccessor()) { accessor.Write(500, 11082003); Console.WriteLine("Memory-mapped file created!"); } // 读取操作,此时mmFile尚未被释放 using (MemoryMappedViewAccessor accessor = mmFile.CreateViewAccessor()) { int value = accessor.ReadInt32(500); Console.WriteLine("The answer is : {0}", value); } }
如果是跨进程读写的场景,需要确保写入进程的MemoryMappedFile实例保持存活(不提前调用Dispose()),直到读取进程完成读取;或者改用基于物理文件的持久化内存映射文件,避免内存中的映射对象被销毁后无法访问。
内容的提问来源于stack exchange,提问作者Asive
相关产品推荐
相关产品推荐

