Tôi đang cố triển khai Tệp Ánh xạ Bộ nhớ trong ứng dụng của tôi (cụ thể là Dịch vụ Windows), sau đó sử dụng biểu mẫu C# để đọc từ MMF dịch vụ ghi vào. Thật không may tôi không thể có vẻ để có được hình thức để đọc bất cứ điều gì từ MMF, quan trọng hơn có vẻ như là hình thức không bao giờ tìm thấy MMF được tạo ra bởi các dịch vụ. Dưới đây là các đoạn mã phác thảo những gì tôi đang làm, bất cứ ai có thể nhìn thấy những gì tôi đang làm sai hoặc có thể chỉ cho tôi theo một hướng tốt hơn?Khó đọc từ Tập tin Ánh xạ Bộ nhớ
dịch vụ:
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();
}
Mẫu:
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**
}
}
}
Thêm vào đó, trong khi dịch vụ được 'Chạy', các MMF nên luôn luôn có một xử lý và không nên được thu thập bởi các bộ thu rác;
Vì vậy, bạn * làm * có được FileNotFoundException? –
Là hình thức exe trong cùng một thư mục với dịch vụ? Đôi khi thư mục mặc định của dịch vụ là c: \ windows \ system32 Tôi sẽ thử chỉ định đường dẫn đầy đủ của tệp, chứ không phải đường dẫn tương đối như "AuditStream" –
Tài khoản mà dịch vụ đang chạy là gì? – HABO