標籤:col not oca methods whether release capacity 許可權 enable
1.System.IO.MemoryMappedFiles 記憶體對應檔類
記憶體對應檔將檔案的內容映射到應用程式的邏輯地址空間。 記憶體對應檔使程式員得以處理極大的檔案(這是因為可以並發管理記憶體),並且它們允許對檔案進行完整的隨機訪問而不需要尋找檔案。 記憶體對應檔還可以在多個進程之間進行共用。
CreateFromFile 方法基於磁碟上的現有檔案的指定路徑或 FileStream 建立一個記憶體對應檔。 未映射對應檔時,更改都將自動傳播到磁碟。
CreateNew 方法建立一個未映射到磁碟上的現有檔案的記憶體對應檔;而且這些方法還適合建立用於處理序間通訊 (IPC) 的共用記憶體。
記憶體對應檔與名稱相關聯。
您可以建立記憶體對應檔的多個視圖,包括部分檔案的視圖。 可以將某個檔案的相同部分映射到多個地址,以建立並發記憶體。 為了使兩個視圖能夠並發,必須基於同一記憶體對應檔建立這兩個視圖。 對同一檔案建立兩個檔案對應的兩個視圖不具有並發性。(https://msdn.microsoft.com/zh-cn/library/system.io.memorymappedfiles.memorymappedfile(v=vs.100).aspx)
常用函數:
[SecurityPermissionAttribute(SecurityAction.Demand, Flags = SecurityPermissionFlag.UnmanagedCode)]public static MemoryMappedFile CreateOrOpen( string mapName, //要分配給記憶體對應檔的名稱。 long capacity,//要分配給記憶體對應檔的最大大小(以位元組為單位)。 MemoryMappedFileAccess access,//用於指定記憶體對應檔允許的訪問類型的枚舉值之一。 預設值為 ReadWrite。 MemoryMappedFileOptions options,//枚舉值的按位組合,用於為記憶體對應檔指定記憶體配置選項。 MemoryMappedFileSecurity memoryMappedFileSecurity,//可以針對記憶體對應檔授予的檔案訪問和操作許可權。此參數可以為 null。 HandleInheritability inheritability//用於指定記憶體對應檔的控制代碼能否由子進程繼承的枚舉值之一。 預設值為 None。 )
在系統記憶體中建立或開啟一個具有指定容量、訪問類型、記憶體配置、安全許可權和繼承性的記憶體對應檔。
使用此方法建立或開啟一個不持久保留的記憶體對應檔(即,不與磁碟上的檔案關聯),您可以使用該檔案在進程之間共用資料。
using (var mmf = MemoryMappedFile.CreateOrOpen("testMmf", capacity, MemoryMappedFileAccess.ReadWrite))
{
//通過MemoryMappedFile的CreateViewAccssor方法獲得共用記憶體的訪問器
var viewAccessor = mmf.CreateViewAccessor(0, capacity);
viewAccessor.Write(0, input.Length);
//向共用記憶體4位置寫入字元
viewAccessor.WriteArray<char>(4, input.ToArray(), 0, input.Length);
}
public static MemoryMappedFile CreateNew( string mapName, //要分配給記憶體對應檔的名稱。 long capacity //要分配給記憶體對應檔的最大大小(以位元組為單位)。)
使用此方法建立一個不持久保留的記憶體對應檔(即,不與磁碟上的檔案關聯),您可以使用該檔案在進程之間共用資料。
static void Main(string[] args) { using (MemoryMappedFile mmf = MemoryMappedFile.CreateNew("testmap", 10000)) { bool mutexCreated; Mutex mutex = new Mutex(true, "testmapmutex", out mutexCreated); using (MemoryMappedViewStream stream = mmf.CreateViewStream()) { BinaryWriter writer = new BinaryWriter(stream); writer.Write(1); } mutex.ReleaseMutex(); mutex.WaitOne(); using (MemoryMappedViewStream stream = mmf.CreateViewStream()) { BinaryReader reader = new BinaryReader(stream); Console.WriteLine("Process A says: {0}", reader.ReadBoolean()); Console.WriteLine("Process B says: {0}", reader.ReadBoolean()); Console.WriteLine("Process C says: {0}", reader.ReadBoolean()); } mutex.ReleaseMutex(); } }
C#共用記憶體整理