Неполадки при чтении из файла с отображенной памятью

Я пытаюсь реализовать файл сопоставления памяти в моем приложении (в частности, в службе 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 всегда должна иметь дескриптор и не должна собираться сборщиком мусора;

1 ответ

Решение

Служба работает в другом сеансе, известном как "сеанс 0". Объекты Windows живут в пространстве имен, которое связано с сеансом процесса, поэтому ваша форма не может видеть объект, созданный в сеансе, используемом службой.

Вы должны подготовить Global\ к имени MMF, чтобы создать и получить доступ к объекту в глобальном пространстве имен.

Итак, в сервисе:

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

и в форме:

mmf = MemoryMappedFile.OpenExisting(@"Global\AuditStream");
Другие вопросы по тегам