2013-06-08 42 views
8

Tôi cần truy cập tệp bản đồ bộ nhớ dùng chung (được tạo và sở hữu bởi một chương trình riêng); Để làm như vậy Tôi đang sử dụngGiữ một MemoryMappedFile Alive sau khi vứt bỏ

_map = MemoryMappedFile.OpenExisting(
      "buffer", 
      MemoryMappedFileRights.ReadWrite, 
      HandleInheritability.None); 

_mapAccessor = _map.CreateViewAccessor(0, 0, MemoryMappedFileAccess.ReadWrite); 

Khi tôi đóng ứng dụng mà tôi gọi vứt bỏ bằng các:

public void Dispose() 
{ 
    if (_mapAccessor != null) 
     _mapAccessor.Dispose(); 

    if (_map != null) 
     _map.Dispose(); 
} 

nhưng nó có vẻ như một cái gì đó tôi đang làm ở đây là giết chết các tập tin bản đồ bộ nhớ, vì chương trình khác sử dụng điều này bắt đầu nhận được lỗi bộ nhớ được bảo vệ.

Nếu tôi xử lý _map nó có thực sự phá hủy tệp ánh xạ bộ nhớ, ngay cả khi quyền sở hữu không được thừa kế của nó không?

Cập nhật

Hóa ra các chương trình khác, không phải dưới sự kiểm soát của tôi, được làm những điều nghịch ngợm sau khi tôi đã báo hiệu nó đi để idle mode (ngay trước khi xử lý bản đồ bộ nhớ).

Khi sử dụng 'MemoryMappedFile.OpenExisting' with 'HandleInheritability.None', tệp bản đồ bộ nhớ sẽ không bị hủy sau khi vứt bỏ.

+0

Không, xử lý một MemoryMappedFile được mở bằng cách gọi 'OpenExisting()' sẽ * không * phá hủy MMF cơ bản. Quá trình được gọi là API Windows 'CreateFileMapping()' điều khiển toàn bộ thời gian tồn tại của các cuộc gọi MMF và 'OpenExisting()' 'OpenFileMapping()' thay thế. –

+0

Bạn nên tập trung tốt hơn vào nội dung của mmf và các đối tượng đồng bộ hóa mà bạn cần để truy cập an toàn mmf. Rằng bạn dường như không có bất kỳ đồng bộ hóa như vậy tại chỗ là một btw Red Flag khá lớn. –

+0

Bạn là đúng Hans, nó không phải là bản đồ bộ nhớ đó là vấn đề, nó chỉ đơn giản là chương trình khác (không phải của tôi) làm những điều nghịch ngợm với một người lái xe, sau khi tôi đã báo hiệu một chế độ đi-nhàn rỗi. –

Trả lời

2

Không, xử lý MemoryMappedFile được mở bằng cách gọi OpenExisting() sẽ không hủy MMF cơ bản.

Quá trình được gọi là API Windows CreateFileMapping() kiểm soát thời gian tồn tại của MMF và OpenExisting() gọi OpenFileMapping() thay thế.