在基于 Windows 窗体 (WinForms) 的应用程序中,MemoryMappedFile
同样可以高效地进行进程间共享内存(IPC)。本文将介绍如何在 WinForms 应用程序中使用内存映射文件,提供包括创建、读写及同步等多个示例,让您的应用能够更方便地在不同进程之间共享数据。
在主窗口,我们添加一个按钮。当点击按钮时,会将数据写入共享内存。
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);
}
}
}
}
}
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 许可协议。转载请注明出处!