2012-07-18 36 views
5

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;

+0

Vì vậy, bạn * làm * có được FileNotFoundException? –

+0

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" –

+1

Tài khoản mà dịch vụ đang chạy là gì? – HABO

Trả lời

13

Dịch vụ chạy trong một phiên khác, "phiên 0" nổi tiếng. Các đối tượng Windows sống trong một không gian tên được liên kết với phiên của quá trình, do đó biểu mẫu của bạn không thể thấy đối tượng được tạo trong phiên được dịch vụ sử dụng.

Bạn phải thêm Global\ vào tên mmf để tạo và truy cập đối tượng trong không gian tên chung.

Vì vậy, trong các dịch vụ:

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

và theo hình thức:

mmf = MemoryMappedFile.OpenExisting(@"Global\AuditStream"); 
+0

Cảm ơn bạn đã làm điều đó !, bây giờ tôi chỉ phải vật lộn với một truy cập bị từ chối lỗi trên đó. – Zholen

+0

Tôi muốn thêm cho bất kỳ người nào khác xem bài đăng này, đừng quên làm điều tương tự với mutex của bạn ("Toàn cầu"), bạn rất có thể sẽ gặp phải sự cố truy cập khi bạn có thể thấy luồng sau đây là một cách để sửa chữa nó, mặc dù nó để nó rất 'mở': – Zholen

+8

var security = new MemoryMappedFileSecurity(); security.AddAccessRule (mới AccessRule ("mọi người", MemoryMappedFileRights.FullControl, AccessControlType.Allow)); mmf = MemoryMappedFile.CreateOrOpen (@ "Toàn cầu \ AmToteAuditStream", 1024 * 1024, MemoryMappedFileAccess.ReadWrite, MemoryMappedFileOptions.DelayAllocatePages, security, HandleInheritability.Inheritable); – Zholen

Các vấn đề liên quan