gpt4 book ai didi

c# - MemoryMappedFile.CreateOrOpen 抛出句柄无效

转载 作者:行者123 更新时间:2023-11-30 16:25:09 39 4
gpt4 key购买 nike

我有创建内存映射文件的代码,如下所示:

using (Mutex mutex = new Mutex(false, CoordinatorMutexName))
{
mutex.WaitOne();

var security = new MemoryMappedFileSecurity();
security.SetAccessRule(
new AccessRule<MemoryMappedFileRights>(
new SecurityIdentifier(WellKnownSidType.WorldSid, null), // everyone
MemoryMappedFileRights.FullControl,
AccessControlType.Allow));

MemoryMappedFile coordinator = MemoryMappedFile.CreateOrOpen(
CoordinatorMMFName,
16 * 1024 * 1024 + 4,
MemoryMappedFileAccess.ReadWrite,
MemoryMappedFileOptions.DelayAllocatePages,
security,
HandleInheritability.None);

...
...

}

在某些情况下(如下所述),CreateOrOpen 调用会引发以下异常:

 System.IO.IOException: The handle is invalid.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.MemoryMappedFiles.MemoryMappedFile.CreateOrOpenCore(SafeFileHandle fileHandle, String mapName, HandleInheritability inheritability, MemoryMappedFileSecurity memoryMappedFileSecurity, MemoryMappedFileAccess access, MemoryMappedFileOptions options, Int64 capacity)
at System.IO.MemoryMappedFiles.MemoryMappedFile.CreateOrOpen(String mapName, Int64 capacity, MemoryMappedFileAccess access, MemoryMappedFileOptions options, MemoryMappedFileSecurity memoryMappedFileSecurity, HandleInheritability inheritability)

它只会在运行自动化测试时抛出此异常,我无法在调试器内部或外部在本地重现此异常。我尝试仅将上述代码提取到独立测试中,但无法重现该问题。但是这里的代码太多了,无法发布所有内容。 MemoryMappedFile 在线程的持续时间内一直存在(假设它已创建),然后被释放。

以下是测试失败的条件:测试旨在从多个线程执行此代码。它们在 NUnit 中,在 CruiseControl.NET 下运行,其服务在 64 位 Windows 2008 Server 上的域帐户(而不是本地计算机帐户)下运行。我可以在登录同一台机器时手动运行这些相同的测试,它们都通过了。

我知道这可能不足以让某人直接解决问题,但我什至不知道如何调查这个问题。在尝试创建或打开内存映射文件时,哪些事情会导致“句柄无效”消息?

最佳答案

它记录了 CreateFileMapping() 的错误代码,这是创建内存映射文件的底层 winapi 函数:

If lpName matches the name of an existing event, semaphore, mutex, waitable timer, or job object, the function fails, and the GetLastError function returns ERROR_INVALID_HANDLE. This occurs because these objects share the same namespace.

所以选择一个好的随机名称来避免这个错误。您可以从 Visual Studio 获得一个:工具 + 创建 GUID,选项 4。它是全局唯一的。

关于c# - MemoryMappedFile.CreateOrOpen 抛出句柄无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10196897/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com