C# 如何检测MemoryMappedFile是否正在使用
在C#4.0中,C# 如何检测MemoryMappedFile是否正在使用,c#,memory-mapped-files,C#,Memory Mapped Files,在C#4.0中,MemoryMappedFile有几种工厂方法:CreateFromFile,CreateNew,CreateOrOpen,或OpenExisting。我需要打开MemoryMappedFile(如果存在),如果不存在,则从文件创建它。我打开内存映射的代码如下所示: try { map = MemoryMappedFile.OpenExisting( MapName, MemoryMappedFileRights.ReadWrite
MemoryMappedFile
有几种工厂方法:CreateFromFile
,CreateNew
,CreateOrOpen
,或OpenExisting
。我需要打开MemoryMappedFile
(如果存在),如果不存在,则从文件创建它。我打开内存映射的代码如下所示:
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;
}
}
它几乎按照我希望的方式工作,但它最终太频繁地在OpenExisting
上抛出异常。在尝试执行OpenExisting
调用之前,是否有方法检查memoryAppedFile
是否确实存在?还是每次都要处理异常
另外,是否有方法确定当前句柄是否是最后一个打开内存文件的句柄,以确定在释放当前句柄时文件是否将关闭?您可以使用:
关于公认的答案,请参见原问题下韩·帕桑的评论。由于我无法将其标记为已接受,因此我将在此处引用它并将其标记为已接受。我不明白您的问题。你说的“但它太频繁地在OpenExisting上引发异常”是什么意思?如果我先尝试CreateFromFile,它会在它已打开时引发异常,如果我先尝试OpenExisting,它会在它未打开时引发异常。如果可能的话,我想通过检查它是否存在来完全避免这些异常。我只想在真正异常的情况下处理异常,而不是每次它碰到那行代码时都处理异常。这不是真正的问题,您需要在第2步工作,以使MMF实际可用。这需要至少一个命名互斥体来控制哪个进程可以写入映射内存。其中一个过程必须是老板,如果你愿意,也必须是仲裁者。它需要首先开始。代码被简化了,实际上我在整个过程中都有一个互斥锁。嗯,所以也许我应该利用互斥体上的“createdNew”out参数。问题是,它只创建了一个内存映射,不允许映射到文件系统文件。有没有办法在文件打开后将其挂接到文件上?
map = MemoryMappedFile.CreateOrOpen(
MapName, length + 16,
MemoryMappedFileAccess.ReadWrite,
MemoryMappedFileOptions.None, null, HandleInheritability.None);