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# List.Sort四种重载总结

    C# List.Sort四种重载总结

    本文详细分析了C#中List.Sort()方法的四种重载形式及其实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-12-12
  • Silverlight实现星星闪烁动画

    Silverlight实现星星闪烁动画

    这篇文章主要为大家详细介绍了Silverlight实现星星闪烁动画,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • 同步调用和异步调用WebService

    同步调用和异步调用WebService

    本文给大家介绍webservice同步调用和异步调用,同步调用就是一个同步操作会阻塞整个当前的进程,直到这个操作完成才能执行下一段代码,异步调用不会阻塞启动操作的调用线程,调用程序必须通过轮流检测,或者等待完成信号来发现调用的完成。小伙伴们跟着小编一起学习
    2015-09-09
  • c#调用api控制windows关机示例(可以重启/注销)

    c#调用api控制windows关机示例(可以重启/注销)

    本文介绍了c#控制windows关机、重启、注销的二种方法,分为调用windows自带的shutdown.exe关机和调用API关机的方法
    2014-01-01
  • 如何在c#中使用opencv函数库

    如何在c#中使用opencv函数库

    这篇文章主要介绍了如何在c#中使用opencv,对图像匹配处理感兴趣的同学可以参考下
    2021-04-04
  • ZooKeeper的安装及部署教程

    ZooKeeper的安装及部署教程

    Zookeeper是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护、名字服务、分布式同步、组服务等,这篇文章主要介绍了ZooKeeper的安装及部署,需要的朋友可以参考下
    2019-06-06
  • 使用C#获取网页HTML源码的例子

    使用C#获取网页HTML源码的例子

    这篇文章主要介绍了使用C#获取网页HTML源码的例子,考虑了区分GB2312和UTF-8编码,需要的朋友可以参考下
    2014-08-08
  • C#对DataTable中的某列进行分组

    C#对DataTable中的某列进行分组

    这篇文章介绍了C#对DataTable某列进行分组的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • 浅谈C# 非模式窗体show()和模式窗体showdialog()的区别

    浅谈C# 非模式窗体show()和模式窗体showdialog()的区别

    下面小编就为大家带来一篇浅谈C# 非模式窗体show()和模式窗体showdialog()的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-07-07
  • unity android设备上查看log输出方式

    unity android设备上查看log输出方式

    这篇文章主要介绍了unity android设备上查看log输出方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04

最新评论