多个内存映射文件是否有问题?
Are multiple memory mapped files bugged?
将第二个内存映射文件添加到我的项目时,第一个不再跨进程工作。
Imports System.IO.MemoryMappedFiles
Module IPC
Private ReadOnly _QlCtxOpen As MemoryMappedViewAccessor = MemoryMappedFile.CreateOrOpen("IPC_QlCtxOpen", 1).CreateViewAccessor()
Public Property IsQlCtxOpen As Boolean
Get
Dim value As Boolean = _QlCtxOpen.ReadBoolean(0)
Debug.Print($"QlCtxOpen {value}")
Return value
End Get
Set(ByVal value As Boolean)
_QlCtxOpen.Write(0, value)
Debug.Print($"set QlCtxOpen to {value}")
End Set
End Property
End Module
将以下行添加到模块时,第一个 mmf 仍在同一个进程中工作,但第二个进程将不再能够读取正确的值。
Private ReadOnly _alreadyOpenPID As MemoryMappedViewAccessor = MemoryMappedFile.CreateOrOpen("IPC_alreadyOpenPID", 4).CreateViewAccessor()
我知道我应该使用互斥锁进行写入,但在我的项目中,写入是由鼠标操作触发的,因此只有 1 个进程会同时使用它。
我不明白我做错了什么来破坏第一个 mmf,它有效 w/o 第二个 mmf。
我正在使用 Microsoft Visual Studio Community 2019
版本 16.11.11 .NET Framework 4.7.2
原来垃圾收集是这里的罪魁祸首。
要解决此问题,只要您需要其他进程读取该值,请确保引用 memory-mapped 文件。
为什么它仍然只使用 1 个声明并且没有引用 memory-mapped 文件对我来说是个谜。
将第二个内存映射文件添加到我的项目时,第一个不再跨进程工作。
Imports System.IO.MemoryMappedFiles
Module IPC
Private ReadOnly _QlCtxOpen As MemoryMappedViewAccessor = MemoryMappedFile.CreateOrOpen("IPC_QlCtxOpen", 1).CreateViewAccessor()
Public Property IsQlCtxOpen As Boolean
Get
Dim value As Boolean = _QlCtxOpen.ReadBoolean(0)
Debug.Print($"QlCtxOpen {value}")
Return value
End Get
Set(ByVal value As Boolean)
_QlCtxOpen.Write(0, value)
Debug.Print($"set QlCtxOpen to {value}")
End Set
End Property
End Module
将以下行添加到模块时,第一个 mmf 仍在同一个进程中工作,但第二个进程将不再能够读取正确的值。
Private ReadOnly _alreadyOpenPID As MemoryMappedViewAccessor = MemoryMappedFile.CreateOrOpen("IPC_alreadyOpenPID", 4).CreateViewAccessor()
我知道我应该使用互斥锁进行写入,但在我的项目中,写入是由鼠标操作触发的,因此只有 1 个进程会同时使用它。
我不明白我做错了什么来破坏第一个 mmf,它有效 w/o 第二个 mmf。
我正在使用 Microsoft Visual Studio Community 2019 版本 16.11.11 .NET Framework 4.7.2
原来垃圾收集是这里的罪魁祸首。 要解决此问题,只要您需要其他进程读取该值,请确保引用 memory-mapped 文件。
为什么它仍然只使用 1 个声明并且没有引用 memory-mapped 文件对我来说是个谜。