如何检测MemoryMappedFile是否正在使用

问题描述 投票:0回答:2

在 C# 4.0 中,

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
上抛出异常。 在我尝试进行
MemoryMappedFile
调用之前,有没有办法检查
OpenExisting
是否确实存在? 还是我每次都必须处理异常?

还有,有没有办法找出当前句柄是否是最后一个打开

MemoryMappedFile
的句柄,以确定当前句柄被处理后是否会关闭文件?

c# memory-mapped-files
2个回答
0
投票

您可以使用MemoryMappedFile.CreateOrOpen

map = MemoryMappedFile.CreateOrOpen(
                MapName, length + 16,
                MemoryMappedFileAccess.ReadWrite, 
                MemoryMappedFileOptions.None, null, HandleInheritability.None);

0
投票

Hans Passant在评论中给出了对我有用的答案:

这不是一个真正的问题,您需要执行步骤 #2 以使 MMF 真正可用。这需要至少一个命名互斥体来控制哪些进程可以写入映射内存。这些流程之一必须是老板,如果你愿意的话,也可以是仲裁者。需要先启动。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.