Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何检测MemoryMappedFile是否正在使用_C#_Memory Mapped Files - Fatal编程技术网

C# 如何检测MemoryMappedFile是否正在使用

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

在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
上抛出异常。在尝试执行
OpenExisting
调用之前,是否有方法检查
memoryAppedFile
是否确实存在?还是每次都要处理异常

另外,是否有方法确定当前句柄是否是最后一个打开
内存文件的句柄,以确定在释放当前句柄时文件是否将关闭?

您可以使用:


关于公认的答案,请参见原问题下韩·帕桑的评论。由于我无法将其标记为已接受,因此我将在此处引用它并将其标记为已接受。

我不明白您的问题。你说的“但它太频繁地在OpenExisting上引发异常”是什么意思?如果我先尝试CreateFromFile,它会在它已打开时引发异常,如果我先尝试OpenExisting,它会在它未打开时引发异常。如果可能的话,我想通过检查它是否存在来完全避免这些异常。我只想在真正异常的情况下处理异常,而不是每次它碰到那行代码时都处理异常。这不是真正的问题,您需要在第2步工作,以使MMF实际可用。这需要至少一个命名互斥体来控制哪个进程可以写入映射内存。其中一个过程必须是老板,如果你愿意,也必须是仲裁者。它需要首先开始。代码被简化了,实际上我在整个过程中都有一个互斥锁。嗯,所以也许我应该利用互斥体上的“createdNew”out参数。问题是,它只创建了一个内存映射,不允许映射到文件系统文件。有没有办法在文件打开后将其挂接到文件上?
map = MemoryMappedFile.CreateOrOpen(
                MapName, length + 16,
                MemoryMappedFileAccess.ReadWrite, 
                MemoryMappedFileOptions.None, null, HandleInheritability.None);