我试图在我的应用程序(特别是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 相关联的 namespace 中,因此您的窗体看不到该服务所使用的 session 中创建的对象。

您必须在mmt名称之前添加Global\才能在全局 namespace 中创建和访问该对象。

因此在服务中:

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

并采用以下形式:
mmf = MemoryMappedFile.OpenExisting(@"Global\AuditStream");

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

10-12 00:52