Trong C# 4.0, MemoryMappedFile
có một số phương pháp nhà máy: CreateFromFile
, CreateNew
, CreateOrOpen
hoặc OpenExisting
. Tôi cần mở MemoryMappedFile
nếu nó tồn tại và nếu không, hãy tạo nó từ một tệp. Mã của tôi để mở bản đồ bộ nhớ trông như thế này:Cách phát hiện xem MemoryMappedFile có đang sử dụng không
try
{
map = MemoryMappedFile.OpenExisting(
MapName,
MemoryMappedFileRights.ReadWrite
| MemoryMappedFileRights.Delete);
}
catch (FileNotFoundException)
{
try
{
stream = new FileStream(
FileName,
FileMode.OpenOrCreate,
FileAccess.ReadWrite,
FileShare.Read | FileShare.Delete);
map = MemoryMappedFile.CreateFromFile(
stream, MapName, length + 16,
MemoryMappedFileAccess.ReadWrite,
null,
HandleInheritability.None,
false);
}
catch
{
if (stream != null)
stream.Dispose();
stream = null;
}
}
Nó khá nhiều hoạt động theo cách tôi muốn nó, nhưng nó kết thúc lên ném một ngoại lệ trên OpenExisting
cách quá thường xuyên. Có cách nào để kiểm tra xem MemoryMappedFile
thực sự tồn tại trước khi tôi cố gắng thực hiện cuộc gọi OpenExisting
? Hay tôi phải đối phó với ngoại lệ mỗi lần?
Ngoài ra, có cách nào để tìm hiểu xem trình xử lý hiện tại có phải là lệnh cuối cùng để mở khóa MemoryMappedFile
không, để xác định xem tệp có bị đóng khi xử lý hiện tại được xử lý không?
Tôi không nhận được câu hỏi của bạn. Những gì bạn có nghĩa là bởi "nhưng nó kết thúc ném một ngoại lệ trên OpenExisting cách quá thường xuyên"? – Krizz
Nếu tôi thử CreateFromFile đầu tiên, nó ném một ngoại lệ nếu nó đã được mở, nếu tôi thử OpenExisting đầu tiên, nó ném một ngoại lệ nếu nó không mở. Tôi muốn hoàn toàn tránh những ngoại lệ nếu có thể bằng cách kiểm tra xem nó có tồn tại không. Tôi chỉ muốn đối phó với ngoại lệ trong những trường hợp thực sự đặc biệt, không phải mỗi lần nó tấn công vào dòng mã đó. –
Đây không phải là một vấn đề thực sự, bạn cần phải làm việc trên bướC# 2 để làm cho MMF thực sự có thể sử dụng được. Điều đó đòi hỏi ít nhất một mutex được đặt tên để kiểm soát quá trình nào có thể ghi vào bộ nhớ được ánh xạ. Một trong những quy trình đó phải là ông chủ, trọng tài nếu bạn muốn. Nó cần phải bắt đầu đầu tiên. –