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

目录

写在前面

代码实现

进程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.");
}

调用示例

总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/581230.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cpp_07_类型转换构造_析构函数_深拷贝_静态成员

1 类型转换构造函数 1.1 why? 基本类型之间的转换,编译器内置转换规则:int -> double 类类型之间的转换,编译器不知道转换规则,需要用户提供:Cat -> Dog // consconv_why.cpp 为什么需要自定义转换 #includ…

记一次修复外网无法访问vmware里面的虚拟机的网络端口的问题

发现一个奇怪的网络问题,vmware里一个程序的端口通过vmnat穿透出来,然后这个端口就能够通过局域网被其他机器访问,但是另一个网段就没法访问这个端口。使用主机上的其他程序使用开启同样的端口,另一个网段的机器却可以访问。我想不…

HarmonyOS栅格布局---GridRow

题外话:栅格布局最初是在web 端应用的,为了解决一个系统在不同的屏幕,和不同的设备上可以不进行多次开发的问题,希望一次开发可以最大化的适配用户的不同类型设备,解决方案:将屏幕采用断点的方式进行布局分…

创新驱动数字经济发展,融云获评「2023 数字经济隐形独角兽」

近期,由北京市大兴区经济和信息化局、北京大兴经济开发区管理委员会、北京隐形独角兽信息科技院联合主办的“2023 数字经济独角兽大会”在北京成功举行。关注【融云 RongCloud】,了解协同办公平台更多干货。 作为专注耕耘通信赛道、掌握关键核心技术、具…

LDO线性稳压器与开关电源的原理

线性稳压器LDO典型代表:LM7805 ,AMS1117,还有一下性能比较好的LDO: 开关稳压器典型代表:LM2596,MP1584,TPS5430,MP2315S LDO靠发热分散能量,纹波较小一般在30mv以下;DCDC通过开关开断…

最新国内使用GPT4教程,GPT语音对话使用,Midjourney绘画,ChatFile文档对话总结+DALL-E3文生图

一、前言 ChatGPT3.5、GPT4.0、GPT语音对话、Midjourney绘画,文档对话总结DALL-E3文生图,相信对大家应该不感到陌生吧?简单来说,GPT-4技术比之前的GPT-3.5相对来说更加智能,会根据用户的要求生成多种内容甚至也可以和…

Ubuntu安装K8S的dashboard(管理页面)

原文网址:Ubuntu安装k8s的dashboard(管理页面)-CSDN博客 简介 本文介绍Ubuntu安装k8s的dashboard(管理页面)的方法。 Dashboard的作用有:便捷操作、监控、分析、概览。 相关网址 官网地址:…

电路设计(8)——计时器的multism仿真

1.功能设计 这是一个计时电路,在秒脉冲的驱动下,计时器开始累加,6个数码管分别显示计时的 时:分:秒。 仿真图如下所示: 左边的运放构成了振荡电路,可以产生脉冲波。这个脉冲波给计时电路提供基准…

0.1+0.2≠0.3,揭秘Python自带的Bug

朋友们,问一个简单的问题:0.10.2? 你肯定会说:中国人不骗中国人,0.10.20.3。 但是在Python里,0.10.2≠0.3 ,我们今天一起来看看这个,并且看一下解决办法。 离奇的错误 在python里…

【日志系列】什么是分布式日志系统?

✔️什么是分布式日志系统? 现在,很多应用都是集群部署的,一次请求会因为负载均衡而被路由到不同的服务器上面,这就导致一个应用的日志会分散在不同的服务器上面。 当我们要向通过日志做数据分析,问题排查的时候&#…

60辆苏州金龙氢能物流车打造长三角绿色运营新范本

近日,在广泰氢能杭州湾运营中心,一辆辆苏州金龙18吨氢能物流车来回穿梭,它们从运营中心出发,将不同类型的汽车零配件从物流园区运往整车制造厂。司机李师傅表示,这条路线他跑了几个月,每天四趟。和他一样&a…

GPT分区格式

GPT分区格式 [rootlocalhost ~]# gdisk /dev/sdb -bash: gdisk: 未找到命令 [rootlocalhost ~]# yum -y install gdisk- gdisk命令用于查看磁盘使用情况和磁盘分区(GPT分区格式) - 命令格式:gdisk [选项...] [设备路径] - 常用选项&…

Flink项目实战篇 基于Flink的城市交通监控平台(下)

系列文章目录 Flink项目实战篇 基于Flink的城市交通监控平台(上) Flink项目实战篇 基于Flink的城市交通监控平台(下) 文章目录 系列文章目录4. 智能实时报警4.1 实时套牌分析4.2 实时危险驾驶分析4.3 出警分析4.4 违法车辆轨迹跟…

redis中根据通配符删除key

redis中根据通配符删除key 我们是不是在redis中keys user:*可以获取所有key,但是 del user:*却不行这里我提供的命令主要是SCANSCAN 0 MATCH user:* COUNT 100使用lua保证原子性 SCAN参数描述 在示例中,COUNT 被设置为 100。这是一个防止一次性获取大…

TiDB 7.1 多租户在中泰证券中的应用

本文详细介绍了中泰证券在系统国产化改造项目中采用 TiDB 多租户技术的实施过程。文章分析了中泰证券数据库系统现状以及引入 TiDB 资源管控技术的必要性,探讨了 TiDB 多租户的关键特性,并阐述了在实际应用中的具体操作步骤。通过该技术的应用&#xff0…

JMeter逻辑控制器之ForEach控制器

1. 背景 前段时间在对某项目进行测试,存在一个需要遍历所有组织机构后给每个组织下新增部门的场景,其实也可以通过在数据库中直接添加数据这种方式来实现,但是有点风险,可能会生成脏数据,后期也不好排查,最…

linux系统 CentOS Tomcat 部署论坛

jdk安装命令:yum -y install java-1.8.0-openjdk-devel.x86_64 结尾上显示下图为成功 检查jdk环境是否配置成功命令:java -version或javac 显示版本 显示信息 mysql安装: 检查是否存mariadb数据库:rpm -qa | grep mariad 卸载ma…

企业计算机服务器中了360后缀勒索病毒如何处理,勒索病毒应对步骤

网络技术的应用与发展,为企业的生产运营提供了有力保障,但也为网络安全威胁埋下隐患。近期,网络上的勒索病毒非常嚣张,严重影响了企业的生产运营。近日,云天数据恢复中心接到很多企业的求助,企业的计算机服…

嵌入式单片机的存储区域与堆和栈

一、单片机存储区域 如图所示位STM32F103ZET6的参数: 单片机的ROM(内部FLASH):512KB,用来存放程序代码的空间。 单片机的RAM:64KB,一般都被分配为堆、栈、变量等的空间。 二、堆和栈的概念 …

HBase 例行灾备方案:快照备份与还原演练

博主历时三年精心创作的《大数据平台架构与原型实现:数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行,点击《重磅推荐:建大数据平台太难了!给我发个工程原型吧!》了解图书详情,…