gpt4 book ai didi

c# - 无法从内存映射文件读取

转载 作者:太空狗 更新时间:2023-10-29 20:59:16 24 4
gpt4 key购买 nike

我正在尝试在我的应用程序(特别是 Windows 服务)中实现内存映射文件,然后使用 C# 表单从服务写入的 MMF 中读取。不幸的是,我似乎无法获得从 MMF 读取任何内容的表单,更重要的是,该表单似乎永远找不到服务创建的 MMF。下面是概述我在做什么的代码片段,任何人都可以看到我做错了什么或者能够指出我更好的方向吗?

服务:

private MemoryMappedFile mmf = MemoryMappedFile.CreateOrOpen("AuditStream", 1024 * 1024);
private Mutex mutex = new Mutex(false, "MyMutex");

byte[] msg = new byte[1];
var view = mmf.CreateViewStream(0, 1);
byte[] rmsg = new byte[1];

for (int i = 0; i < 400; i++)
{
mutex.WaitOne();
for (int j = 0; j < msg.Length; j++)
{
msg[j] = (byte)i;
}

view.Position = 0;
view.Write(msg, 0, bufferSize);

//the next 3 lines verify that i wrote to the mmf and can potentially read from it
//These are just for testing
view.Position = 0;
view.Read(rmsg, 0, 1);
Log.Error("Finished MMF", rmsg[0].ToString());

mutex.ReleaseMutex();
}

表格:

private MemoryMappedFile mmf;
private Mutex mutex;
Thread t = new Thread(MmfMonitor);
t.Start();

private void MmfMonitor()
{

byte[] message = new byte[1];
while(!quit)
{
try
{
**mmf = MemoryMappedFile.OpenExisting("AuditStream");**
mutex = Mutex.OpenExisting("MyMutex");
var view = mmf.CreateViewStream(0, 1);

mutex.WaitOne();
view.Position = 0;
view.Read(message, 0, 1);
Invoke(new UpdateLabelCallback(UpdateLabel), message[0].ToString());
mutex.ReleaseMutex();
}catch(FileNotFoundException)
{
**//The AuditStream MMF is never found, and therefore doesnt every see the proper values**
}
}
}

此外,当服务处于“运行”状态时,MMF 应始终具有句柄且不应被垃圾收集器收集;

最佳答案

服务在不同的 session 中运行,即著名的“ session 0”。 Windows 对象存在于与进程 session 关联的命名空间中,因此您的表单看不到在服务使用的 session 中创建的对象。

您必须在 mmf 名称前加上 Global\ 才能创建和访问全局命名空间中的对象。

所以在服务中:

mmf = MemoryMappedFile.CreateOrOpen(@"Global\AuditStream", ...)

形式为:

mmf = MemoryMappedFile.OpenExisting(@"Global\AuditStream");

关于c# - 无法从内存映射文件读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11547583/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com