编辑
2025-09-17
C#
00

目录

配置 MemoryMappedFile
创建 MemoryMappedFile 并写入数据
读取共享内存中的数据
使用互斥体进行同步
User类
主窗口写入数据
读取数据窗口
结论

在基于 Windows 窗体 (WinForms) 的应用程序中,MemoryMappedFile 同样可以高效地进行进程间共享内存(IPC)。本文将介绍如何在 WinForms 应用程序中使用内存映射文件,提供包括创建、读写及同步等多个示例,让您的应用能够更方便地在不同进程之间共享数据。

配置 MemoryMappedFile

创建 MemoryMappedFile 并写入数据

在主窗口,我们添加一个按钮。当点击按钮时,会将数据写入共享内存。

C#
public partial class Form1 : Form { MemoryMappedFile mnf; public Form1() { InitializeComponent(); } private void btnWrite_Click(object sender, EventArgs e) { MemoryMappedFile mmf = MemoryMappedFile.CreateOrOpen("WinFormsSharedMemory", 1024); using (MemoryMappedViewStream stream = mmf.CreateViewStream()) { string message = "Hello from WinForms!"; byte[] messageBytes = Encoding.UTF8.GetBytes(message); stream.Write(messageBytes, 0, messageBytes.Length); MessageBox.Show("Data written to shared memory."); } } }

注意:手动Dispose MemoryMappedFile 好像没有效果!

读取共享内存中的数据

接着,我们在另一个窗口中读取共享内存的数据,并在界面上显示出来。

C#
using System; using System.IO.MemoryMappedFiles; using System.Text; using System.Windows.Forms; namespace WinFormsMemoryMappedFile { public partial class ReaderForm : Form { public ReaderForm() { InitializeComponent(); } private void btnRead_Click(object sender, EventArgs e) { using (MemoryMappedFile mmf = MemoryMappedFile.OpenExisting("WinFormsSharedMemory")) { using (MemoryMappedViewStream stream = mmf.CreateViewStream()) { byte[] buffer = new byte[1024]; stream.Read(buffer, 0, buffer.Length); string message = Encoding.UTF8.GetString(buffer).TrimEnd('\0'); MessageBox.Show("Data read from shared memory: " + message); } } } } }

image.png

使用互斥体进行同步

User类

C#
public class User { public string name { get; set; } public int age { get; set; } }

为确保多进程访问共享内存的同步操作,我们将加入互斥体 (Mutex)。

主窗口写入数据

在主窗口中修改写入操作,加入互斥体控制。

C#
using System.IO.MemoryMappedFiles; using System.Text; using System.Text.Json; namespace AppMem { public partial class Form1 : Form { MemoryMappedFile mmf; public Form1() { InitializeComponent(); } private void btnWrite_Click(object sender, EventArgs e) { User user = new User() { name = "张三", age = 99 }; MemoryMappedFile mmf = MemoryMappedFile.CreateOrOpen("WinFormsSharedMemory", 1024); using (Mutex mutex = new Mutex(false, "WinFormsSharedMemoryMutex")) { mutex.WaitOne(); using (MemoryMappedViewStream stream = mmf.CreateViewStream()) { byte[] messageBytes = Encoding.UTF8.GetBytes(JsonSerializer.Serialize(user)); stream.Write(messageBytes, 0, messageBytes.Length); MessageBox.Show("Data written to shared memory."); } mutex.ReleaseMutex(); } } } }

读取数据窗口

在读取数据窗口中,同步操作的代码如下:

C#
using System.IO.MemoryMappedFiles; using System.Text; using System.Text.Json; namespace AppReadMem { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btnRead_Click(object sender, EventArgs e) { using (MemoryMappedFile mmf = MemoryMappedFile.OpenExisting("WinFormsSharedMemory")) using (Mutex mutex = new Mutex(false, "WinFormsSharedMemoryMutex")) { mutex.WaitOne(); using (MemoryMappedViewStream stream = mmf.CreateViewStream()) { byte[] buffer = new byte[1024]; stream.Read(buffer, 0, buffer.Length); string message = Encoding.UTF8.GetString(buffer).TrimEnd('\0'); User user = JsonSerializer.Deserialize<User>(message); txt.Text = user.name + ":" + user.age; } mutex.ReleaseMutex(); } } } }

结论

在基于 WinForms 的应用程序中,可以通过使用 MemoryMappedFile 实现进程间共享内存通信。本文介绍了如何创建和配置 MemoryMappedFile,以及如何通过同步机制 (Mutex) 确保安全的读写操作。

这些技术使得在不同进程之间共享数据变得简单且高效,非常适用于需要快速通信的应用场景,如实时系统或高性能计算。希望这篇文章对你有所帮助!

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!