`
star65225692
  • 浏览: 277415 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类

c#实现内存映射文件共享内存

 
阅读更多

内存映射文件是利用虚拟内存把文件映射到进程的地址空间中去,在此之后进程操作文件,就像操作进程空间里的地址一样了,比如使用c语言的 memcpy等内存操作的函数。这种方法能够很好的应用在需要频繁处理一个文件或者是一个大文件的场合,这种方式处理IO效率比普通IO效率要高

共享内存是内存映射文件的一种特殊情况,内存映射的是一块内存,而非磁盘上的文件。共享内存的主语是进程(Process),操作系统默认会给每一 个进程分配一个内存空间,每一个进程只允许访问操作系统分配给它的哪一段内存,而不能访问其他进程的。而有时候需要在不同进程之间访问同一段内存,怎么办 呢?操作系统给出了创建访问共享内存的API,需要共享内存的进程可以通过这一组定义好的API来访问多个进程之间共有的内存,各个进程访问这一段内存就 像访问一个硬盘上的文件一样。而.Net 4.0中引入了System.IO. MemoryMappedFiles命名空间,这个命名空间的类对windows 共享内存相关API做了封装,使.Net程序员可以更方便的使用内存映射文件。

在C#中使用共享内存。以下App1的代码让用户输入一行文本到共享内存中;App2不停的刷新控制台,输出最新的共享内存内容;App3实现的功能和App2相同,但读取方法不同。

App1代码:

using System;
using System.Collections.Generic;android从资源文件中读取文件流显示

using System.Linq;
using System.Text;

using System.IO;

//引用内存映射文件命名空间
using System.IO.MemoryMappedFiles;

namespace App1
{
    class Program
    {
        static void Main(string[] args)
        {
            long capacity = 1<<10<<10;

            //创建或者打开共享内存
            using (var mmf = MemoryMappedFile.CreateOrOpen("testMmf", capacity, MemoryMappedFileAccess.ReadWrite))
            {
                //通过MemoryMappedFile的CreateViewAccssor方法获得共享内存的访问器
                var viewAccessor = mmf.CreateViewAccessor(0, capacity);
                //循环写入,使在这个进程中可以向共享内存中写入不同的字符串值
                while (true)
                {
                    Console.WriteLine("请输入一行要写入共享内存的文字:");

                    string input = Console.ReadLine();

                    //向共享内存开始位置写入字符串的长度
                    viewAccessor.Write(0, input.Length);

                    //向共享内存4位置写入字符
                    viewAccessor.WriteArray<char>(4, input.ToArray(), 0, input.Length);
                }

            }
           
        }
    }
}
App2代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

//引用使用内存映射文件需要的命名空间
using System.IO.MemoryMappedFiles;

namespace App2
{
    class Program
    {
        static void Main(string[] args)
        {
              long capacity = 1<<10<<10;

              using (var mmf = MemoryMappedFile.OpenExisting("testMmf"))
              {
                  MemoryMappedViewAccessor viewAccessor = mmf.CreateViewAccessor(0, capacity);

                  //循环刷新共享内存字符串的值
                  while (true)
                  {
                      //读取字符长度
                      int strLength = viewAccessor.ReadInt32(0);                     
                      char[] charsInMMf = new char[strLength];
                      //读取字符
                      viewAccessor.ReadArray<char>(4, charsInMMf, 0, strLength);
                      Console.Clear();
                      Console.Write(charsInMMf);
                      Console.Write("\r");
                      Thread.Sleep(200);
                  }
              }
        }
    }
}
App3代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.IO.MemoryMappedFiles;
using System.IO;

namespace App3
{
    class Program
    {
        static void Main(string[] args)
        {
            long capacity = 1 << 10 << 10;
            //打开共享内存
            using (var mmf = MemoryMappedFile.OpenExisting("testMmf"))
            {
                //使用CreateViewStream方法返回stream实例
                using (var mmViewStream = mmf.CreateViewStream(0, capacity))
                {
                    //这里要制定Unicode编码否则会出问题
                    using (BinaryReader rdr = new BinaryReader(mmViewStream,Encoding.Unicode))
                    {
                        while (true)
                        {
                            mmViewStream.Seek(0, SeekOrigin.Begin);

                            int length = rdr.ReadInt32();

                            char[] chars = rdr.ReadChars(length);

                            Console.Write(chars);
                            Console.Write("\r");

                            System.Threading.Thread.Sleep(200);
                            Console.Clear();
                        }
                    }
                }
            }
        }
    }
}

分享到:
评论

相关推荐

    C# 内存文件共享, c# 内存映射文件,用于.net 4.0

    在标题和描述中提到的"C# 内存文件共享, c# 内存映射文件"就是指这一特性。 内存映射文件的核心是使用`System.IO.MemoryMappedFiles`命名空间中的类。主要有以下关键知识点: 1. **MemoryMappedFile类**:这是内存...

    VC++中使用内存映射文件处理大文件.doc

    本文将详细介绍如何在VC++(Visual C++)环境下利用内存映射文件(memory-mapped file)来处理大文件,包括基本原理、实现步骤以及实际应用案例。 #### 一、内存映射文件的基本概念 内存映射文件是一种特殊的文件...

    C#进程间通信之共享内存

    1. **创建内存映射文件**:使用MemoryMappedFile.CreateNew或MemoryMappedFile.OpenExisting方法创建一个新的内存映射文件,或者打开一个已存在的文件。这将分配一块系统内存,供所有进程共享。 2. **创建视图访问...

    C#内存映射教程(代码)

    ### C#内存映射教程详解 #### 一、引言 在C#中,内存映射是一种高效的数据共享机制,允许一个或多个进程通过映射同一个文件或物理内存区域到进程地址空间,从而实现进程间的数据共享。这种技术广泛应用于需要进行...

    C#实现共享内存通讯交互

    在这个"C#实现共享内存通讯交互"的项目中,我们将探讨如何使用C#语言来实现在WinForms应用程序中利用共享内存进行数据通信。 首先,我们要了解C#中的内存管理主要是通过.NET框架的垃圾回收机制来完成的,它并不直接...

    内存共享c#版.rar_C# 内存共享_c# 共享内存_c#内存共享_共享内存_内存使用

    2. **内存映射文件**:在Windows API中,内存映射文件(Memory-Mapped Files)是一种实现内存共享的有效方式。它将文件映射到进程的地址空间,使得多个进程可以同时访问同一文件的内容,就像它们都在操作同一块内存...

    c# 共享内存,MemoryMappedFiles

    当处理大型数据或需要在多个进程(或多个程序)之间共享数据时,MemoryMappedFiles(内存映射文件)是一种非常有用的技术。它允许将文件映射到进程的虚拟内存中,从而可以直接在内存中读取和写入文件的内容,而无需...

    codesys与C#通过共享内存实现通信

    在本场景中,我们关注的是如何使用Codesys(一种基于IEC 61131-3标准的PLC编程软件)和C#(微软开发的面向对象的编程语言)通过共享内存实现通信。这种通信方式高效且直接,特别适用于需要快速数据交换的环境。 ...

    C#进程间通信-共享内存代码实例

    本篇文章将深入探讨C#中的共享内存实现,并通过一个具体的代码实例来阐述其工作原理。 共享内存是一种让多个进程可以直接读写同一块内存空间的方法,从而实现数据的快速传递。在C#中,我们可以利用.NET Framework...

    C#实现文件的内存共享可读写.rar

    该资源用c#实现了内存映射文件共享内存,初学者应该比较好懂。Shared Memory1和Shared Memory2是一组共享内存的读写,Shared Memory3和WriteRead也是一组共享内存的读写

    .net4.0多进程间共享内存实现通信

    在VB.NET和C#中,我们可以按照以下步骤创建和操作内存映射文件: 1. **创建内存映射文件**:使用`MemoryMappedFile.CreateNew()`或`MemoryMappedFile.OpenExisting()`方法创建或打开一个内存映射文件。创建时需要...

    内存共享示例(C#)

    在C#编程语言中,我们可以使用多种技术来实现内存共享,这些技术包括但不限于:内存映射文件、共享内存、委托事件、线程间通信以及通过网络套接字等。下面将详细阐述这些方法,并结合"Client"、"MQAD"和"Server"这三...

    C#内存共享图片和结构体.zip

    因此,如果想要通过命名管道或内存映射文件共享结构体,需要确保结构体的所有成员都是基本类型或者也支持跨进程通信的数据类型。图片通常以二进制格式存储,如JPEG或PNG,可以直接作为字节数组(byte[])进行传输。 ...

    Wince6.0 内存映射

    1. 创建内存映射文件:首先,你需要创建一个内存映射文件,这可以通过CreateFile函数完成。它返回一个文件句柄,这个句柄随后会被用于创建文件映射对象。 2. 创建文件映射对象:接下来,使用CreateFileMapping函数...

    C#利用共享内存实现进程通信示例代码

    总结,C#利用共享内存实现进程通信是一个复杂而高效的技术,需要对Windows API有一定了解。`ShareMemLib`很可能是封装了这些操作的库,提供给开发者方便地在C#项目中使用共享内存。理解并正确应用这一技术,可以极大...

    C#与CoDeSys共享内存例程

    文件"C#_ShareMemory"可能包含了C#实现共享内存的示例代码,而"Codesys_ShareMemory"可能是CoDeSys配置和编程的相关文档或项目文件。 总结,C#与CoDeSys通过共享内存通信可以实现高效的数据交换,简化了通信过程,...

    SharedMemory:C#共享内存类,用于在进程之间共享数据(数组,缓冲区和循环缓冲区)

    共享内存C#共享内存类,用于在进程之间共享数据(数组,缓冲区,循环缓冲区和RPC)关于SharedMemory类库提供了一组C#类,这些C#类利用内存映射文件进行快速的低级进程间通信(IPC)。 最初仅用于在进程之间共享...

    C#操作共享内存读写工程

    在这个"C#操作共享内存读写工程"中,我们将探讨如何利用C#语言来实现这一功能。共享内存在多线程或多进程环境下尤其有用,因为它避免了传统IPC方法(如管道、套接字或消息队列)的数据复制开销。 首先,我们需要...

    C#实现数据共享

    可以使用进程间通信(IPC)技术,如命名管道、套接字、内存映射文件等。 5. **安全释放内存**:在不再需要数据时,确保释放内存,防止内存泄漏。在`unsafe`代码块中,这通常通过将指针设为`null`并调用`GC.Collect...

Global site tag (gtag.js) - Google Analytics