当前位置:首页 > 内存 > 正文

无法跨文件映射提交内存

  • 内存
  • 2024-08-11 09:04:15
  • 5458

一、c#可以通过内存映射的方式从一个工程中读另一个工程共享内存的数据吗内存提供的映像使用虚拟内存将文件映射到处理器的地址空间。这种方法可以很好地应用于需要经常处理文件或者大文件的情况。因而有效处理IO高于共享内存IO
它是共享部分。提供内存。在这种特殊情况下,内存被分配给一块内存而不是磁盘上的一个文件。共享内存是一个进程。操作系统默认会给每个进程分配内存空间。每个进程只允许操作系统访问内存,不能被其他进程访问。有时我们需要在不同进程之间访问相同的内存,我们该怎么办?操作系统提供用于创建和访问共享内存的API。可以共享内存的进程可以通过这组定义好的API在多个进程之间访问内存,从而访问硬盘上的文件。.
MemoryMapped文件空间是在.Net4.0中引入的。该命名空间中的类封装了Windows的
共享内存相关的API,让.Net程序员可以更方便地用内存。
在C#中使用共享内存。下面的App1代码允许用户将一行文本插入到共享内存中;App2不断刷新控制台,输出最新的共享内存内容;
App1代码:
usingSystem;
c;>;
;
;
//引用内存分区文件命名空间
。MemoryMappedFiles
namespaceApp1
{
classProgram
{
staticvoidMain(string[]args)
{
longcapacity=1<<10<<10;
//创建或打开共享内存
using(varmmf=OrOpen("testMmf",capacity,ite))
{
//通过MemoryMappedFile的CreateViewAccessor方法获取共享内存访问器
varviewAccessor=ViewAccessor(0,capacity);
//写入循环,以便可以向其中写入不同的字符串值process
while(true)
{
ine("输入要写入共享内存的文本行:");
stringinput=ne();
//将字符串的长度写入共享内存的开头
(0,);
//将字符写入共享内存位置4
rray(4,y(),0,);
}
}
}
}
}
App2代码:
usingSystem;
c;
;
;
ing;
//使用线程系统文件需要命名空间引用
MappedFiles;1<<10<<10;
using(varmmf=isting("testMmf"))
{
MemoryMappedViewAccessorviewAccessor=ViewAccessor(0,容量);
//循环恢复共享内存字符串值
while(true)
{
//读取长度行为
intstrLength=t32(0);
char[]charsInMMf=newchar[strLength];
//读取字符
ray(4,charsInMMf,0,strLength);
();
(charsInMMf);
("\r");
(200);
}
}
}
}
}
App3代码:
usingSystem;
c;
;
使用系统。/>{
staticvoidMain(string[]args)
{
longcapacity=1<<10<<10;
//打开共享内存
using(varmmf=isting("testMmf"))
{
//使用CreateViewStream方法接收流,例如
使用(varmmViewStream=ViewStream(0,capacity))
{
//这里必须指定Unicode编码方式,否则会出现问题
using(BinaryReaderrdr=newBinaryReader(mmViewStream,e))
{
while(true)
{
(0,);
intlength=t32();
char[]chars=ars(
(chars);
("\r");
(200)
();
}
}
}
}
}
}
}
二、为什么我的电脑老出来打开共享内存映射文件失败?在本地连接中包含文件和打印机共享