出现了一些问题,当我读取一段时间内的内存映射文件时,它会随机从内存中删除,我不知道发生了什么。是内核或GC从内存中删除了它吗?如果是,请问如何防止它们这样做?
我正在将对象序列化为Json并写入内存。
在读取了几次后,再次尝试读取时出现异常,我会收到“FileNotFoundException:无法找到指定的文件。”
我正在将对象序列化为Json并写入内存。
在读取了几次后,再次尝试读取时出现异常,我会收到“FileNotFoundException:无法找到指定的文件。”
private const String Protocol = @"Global\";
写入内存映射文件的代码:
public static Boolean WriteToMemoryFile<T>(List<T> data)
{
try
{
if (data == null)
{
throw new ArgumentNullException("Data cannot be null", "data");
}
var mapName = typeof(T).FullName.ToLower();
var mutexName = Protocol + typeof(T).FullName.ToLower();
var serializedData = JsonConvert.SerializeObject(data);
var capacity = serializedData.Length + 1;
var mmf = MemoryMappedFile.CreateOrOpen(mapName, capacity);
var isMutexCreated = false;
var mutex = new Mutex(true, mutexName, out isMutexCreated);
if (!isMutexCreated)
{
var isMutexOpen = false;
do
{
isMutexOpen = mutex.WaitOne();
}
while (!isMutexOpen);
var streamWriter = new StreamWriter(mmf.CreateViewStream());
streamWriter.WriteLine(serializedData);
streamWriter.Close();
mutex.ReleaseMutex();
}
else
{
var streamWriter = new StreamWriter(mmf.CreateViewStream());
streamWriter.WriteLine(serializedData);
streamWriter.Close();
mutex.ReleaseMutex();
}
return true;
}
catch (Exception ex)
{
return false;
}
}
从内存映射文件读取的代码:
public static List<T> ReadFromMemoryFile<T>()
{
try
{
var mapName = typeof(T).FullName.ToLower();
var mutexName = Protocol + typeof(T).FullName.ToLower();
var mmf = MemoryMappedFile.OpenExisting(mapName);
var mutex = Mutex.OpenExisting(mutexName);
var isMutexOpen = false;
do
{
isMutexOpen = mutex.WaitOne();
}
while (!isMutexOpen);
var streamReader = new StreamReader(mmf.CreateViewStream());
var serializedData = streamReader.ReadLine();
streamReader.Close();
mutex.ReleaseMutex();
var data = JsonConvert.DeserializeObject<List<T>>(serializedData);
mmf.Dispose();
return data;
}
catch (Exception ex)
{
return default(List<T>);
}
}
WriteToMemoryFile
和ReadFromMemoryFile
的调用顺序是什么?你意识到mmf.Dispose()
会释放Memory Mapped File
吗? - Ilia Maskovmmf
的终结器是由GC
调用的,尝试在WriteToMemoryFile
之外保持对mmf
的引用。 - Ilia Maskov