C#操作非持久化内存映射文件详解

 更新时间:2023年12月28日 08:45:05   作者:rjcql  
多个进程之间,通过操作未映射到磁盘上现有文件的内存映射文件,可以实现数据共享和类似进程间通讯的功能,下面我们就来学习一下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.");
}

调用示例

总结

总的来说,一番体验下来,采用内存映射文件来做进程间的资源共享或状态同步还是很简便的。

到此这篇关于C#操作非持久化内存映射文件详解的文章就介绍到这了,更多相关C#操作内存映射文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#利用itext实现PDF页面处理与切分

    C#利用itext实现PDF页面处理与切分

    这篇文章主要介绍了如何在C#中使用itext做一个pdf的页面大小一致性处理,然后再根据数据切分出需要的pdf,感兴趣的小伙伴可以了解一下
    2022-04-04
  • C#利用Label标签控件模拟窗体标题的移动及窗体颜色不断变换效果

    C#利用Label标签控件模拟窗体标题的移动及窗体颜色不断变换效果

    Label标签控件相信对大家来说都不陌生,下面这篇文章主要给大家介绍了关于C#利用Label标签控件模拟窗体标题的移动及窗体颜色不断变换效果的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下。
    2017-12-12
  • ZooKeeper的安装及部署教程

    ZooKeeper的安装及部署教程

    Zookeeper是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护、名字服务、分布式同步、组服务等,这篇文章主要介绍了ZooKeeper的安装及部署,需要的朋友可以参考下
    2019-06-06
  • C#自定义IP输入框控件

    C#自定义IP输入框控件

    这篇文章主要为大家详细介绍了C#自定义IP输入框控件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • c#winform窗口页面一打开就加载的实现方式

    c#winform窗口页面一打开就加载的实现方式

    这篇文章主要介绍了c#winform窗口页面一打开就加载的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • c#与mysql的连接

    c#与mysql的连接

    c#与mysql的连接...
    2007-03-03
  • C#泛型类创建与使用的方法

    C#泛型类创建与使用的方法

    这篇文章主要为大家详细介绍了C#泛型类创建与使用的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • Unity3D实现批量下载图片功能

    Unity3D实现批量下载图片功能

    这篇文章主要为大家详细介绍了Unity3D实现批量下载图片功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • C#向PPT文档插入图片以及导出图片的实例

    C#向PPT文档插入图片以及导出图片的实例

    PowerPoint演示文稿是我们日常工作中常用的办公软件之一,本篇文章介绍了C#向PPT文档插入图片以及导出图片的实例,非常具有实用价值,需要的朋友可以参考下。
    2016-12-12
  • OpenXml合并Table单元格代码实例

    OpenXml合并Table单元格代码实例

    在本篇文章里小编给大家整理了关于OpenXml合并Table单元格的相关实例详解,需要的朋友们参考下。
    2019-08-08

最新评论