Próbuję zaimplementować plik mapowany w pamięci w mojej aplikacji (w szczególności usługę systemu Windows), a następnie użyć formularza C# do odczytu z usługi MMF, w której zapisuje serwis. Niestety nie mogę uzyskać formularza do odczytu czegokolwiek z FRP, co ważniejsze wydaje się, że formularz nigdy nie znajduje FRP utworzonej przez Serwis. Poniżej znajdują się fragmenty kodu, które pokazują, co robię, czy ktoś może zobaczyć, co robię źle, czy może wskazać mi lepszy kierunek?Rozwiązywanie problemów z pliku mapowanego z pamięcią
Usługa:
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();
}
Postać:
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**
}
}
}
Dodatkowo, podczas gdy usługa jest 'Running', MMF powinien zawsze mieć rączkę i nie powinno się zebrane przez śmieciarza;
Więc, * nie * uzyskać FileNotFoundException? –
Czy formularz exe znajduje się w tym samym katalogu, co usługa? Czasami domyślny katalog usługi to c: \ windows \ system32. Próbowałbym podać pełną ścieżkę do pliku, a nie względną ścieżkę, taką jak "AuditStream". –
Co to jest konto, na którym uruchamiana jest usługa? – HABO