开发者

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

开发者 https://www.devze.com 2023-12-29 10:23 出处:网络 作者: rjcql
目录写在前面代码实现进程A进程B进程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.WriteLiphpne("进程 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 = MemoryMappedFilhttp://www.devze.come.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;
     
    Cowww.devze.comnsole.WriteLine("我是独立进程C");
     
    try
    {
        using MemoryMappedFile mmf = MemoryMappedFile.OpenExisting("test_mem_map_file");
        Mutex mutex = Mutex.OpenExisting("testmapmutex");
        mutex.WaitOne(mgQYYMzi);
     
        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#操作非持久化内存映射文python件详解的文章就介绍到这了,更多相关C#操作内存映射文件内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

    0

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    关注公众号