我有它創建了一個存儲器映射文件如下代碼:MemoryMappedFile.CreateOrOpen拋出的句柄無效
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上的域帳戶(不是本地計算機帳戶)下運行。我可以在登錄到同一臺機器的情況下手動運行這些相同的測試,並且它們全都通過。
我知道這可能不足以讓某人直接解決問題,但即使如何調查此問題,我也不知所措。嘗試創建或打開內存映射文件時,什麼類型的東西可能導致「句柄無效」消息?
它一定是一箇舊的互斥體,它的名字是從來沒有處理過的(當我第一次創建這個互斥體時,我將互斥體命名爲MMF)。生成服務器的重啓清除了它,但我也更改了命名方案以確保它是唯一的。謝謝。 – 2012-04-17 19:50:08
具有相同名稱的互斥體也是我的問題。好找! – CMerat 2015-05-01 15:21:36