Ich versuche, eine Memory Mapped File in meiner Anwendung (speziell ein Windows-Dienst) zu implementieren, und verwenden Sie dann ein C# -Formular aus MMF lesen den Dienst schreibt. Leider kann ich nicht das Formular lesen, um etwas aus dem MMF zu lesen, noch wichtiger scheint es, dass das Formular nie das MMF findet, das vom Dienst erstellt wird. Im Folgenden sind Code-Snippets, die skizzieren, was ich mache, kann jemand sehen, was ich falsch mache oder in der Lage sein, mich in eine bessere Richtung zu zeigen?Fehler beim Lesen von Memory Mapped Datei
Service:
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();
}
Form:
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**
}
}
}
Zusätzlich, während der Dienst 'Running', die MMF sollte immer einen Griff haben und sollten nicht vom Garbage Collector gesammelt erhalten;
Also, Sie * Sie * die FileNotFoundException bekommen? –
Ist die Form exe im selben Verzeichnis wie der Dienst? Manchmal ist das Standardverzeichnis des Dienstes c: \ windows \ system32. Ich würde versuchen, den vollständigen Pfad der Datei anzugeben, keinen relativen Pfad wie "AuditStream". –
Unter welchem Konto wird der Dienst ausgeführt? – HABO