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