2012-04-17 172 views
3

我有它創建了一個存儲器映射文件如下代碼: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上的域帳戶(不是本地計算機帳戶)下運行。我可以在登錄到同一臺機器的情況下手動運行這些相同的測試,並且它們全都通過。

我知道這可能不足以讓某人直接解決問題,但即使如何調查此問題,我也不知所措。嘗試創建或打開內存映射文件時,什麼類型的東西可能導致「句柄無效」消息?

回答

3

據記載錯誤代碼的CreateFileMapping(),它創建一個存儲器映射文件底層WINAPI功能:

如果lpName現有的事件,信號量,互斥,可等待計時器,或作業的名稱相匹配對象,函數失敗,並且GetLastError函數返回ERROR_INVALID_HANDLE。這是因爲這些對象共享相同的名稱空間。

所以選擇一個好的隨機名稱來避免這個錯誤。您可以從Visual Studio獲得一個:工具+創建GUID,選項4.它是全局唯一的。

+1

它一定是一箇舊的互斥體,它的名字是從來沒有處理過的(當我第一次創建這個互斥體時,我將互斥體命名爲MMF)。生成服務器的重啓清除了它,但我也更改了命名方案以確保它是唯一的。謝謝。 – 2012-04-17 19:50:08

+0

具有相同名稱的互斥體也是我的問題。好找! – CMerat 2015-05-01 15:21:36