消耗已释放的内存映射文件
本文关键字:内存 映射 文件 释放 | 更新日期: 2023-09-27 18:27:10
如果这是一个糟糕的问题,请原谅,因为我不擅长内存映射文件。我在我的项目中使用内存映射文件。我正在跟踪正在进行的文件和已在内存映射文件中处理的文件。我有两个内存映射文件。在第一个内存映射的文件中,我跟踪已处理的文件,在第二个内存映射文件中,跟踪正在处理的文件。因此,当对特定文件的处理完成时,我在第一个内存映射文件中创建一个条目,并从第二个映射文件中删除该条目。现在的问题是,如果处理完所有文件,我将处理第二个内存映射文件对象。但是,当用户添加更多的文件进行处理时,我将初始化一个新的内存映射文件对象,该对象的名称与第二个内存映射文件名称相同。当我尝试访问第二个文件时,它会出现异常"安全句柄已关闭"。
请注意:我必须处理第二个内存映射文件对象
请提出建议。
首次更新写入第一个内存映射文件的函数
Public void WriteFile()
{
DialogResult result = folderBrowserDialog1.ShowDialog();
if (result == DialogResult.OK)
{
mmf1 = MemoryMappedFile.OpenExisting("Some File Name1");
Class1 Class1obj = new Class1();
string foldername = folderBrowserDialog1.SelectedPath;
Class1obj.CreateMMFFile1(foldername, mmf1, "MMF_IPC1");
}
Class1.RefreshExplorer();
}
写入第二个内存映射文件的函数:
public void ProcessFiles()
{
DialogResult result = folderBrowserDialog1.ShowDialog();
if (result == DialogResult.OK)
{
mmf = MemoryMappedFile.OpenExisting("Some File Name");
Class1 Class1obj = new Class1();
string foldername = folderBrowserDialog1.SelectedPath;
Class1obj.CreateMMFFile1(foldername, mmf, "MMF_IPC");
}
Class1.RefreshExplorer();
}
函数,用于附加第一个文件并处理第二个文件。
Public void AppendFile()
{
Class1 Class1obj = new Class1();
string foldername = folderBrowserDialog1.SelectedPath;
Class1obj.AppendToMMFFile(mmf1, "MMF_IPC1");
Class1.RefreshExplorer();
mmf.Dispose();
}
现在,当用户为处理ProcessFiles()添加新文件时,将调用函数,我得到一个异常。让我知道我还能做些什么来详细说明它。CreateMMFFile1()和CreateMMFFile()是写入内存映射文件的函数。
第二次更新这里是AppendToMMFFile函数,它将第一个MMF文件数据附加到第二个MMF文档中。
Public void AppendToMMFFile()
{
StringBuilder sb = new StringBuilder();
string str = string.Empty;
try
{
using (var stream = mmf.CreateViewStream())
{
System.IO.BinaryReader reader = new System.IO.BinaryReader(stream, System.Text.Encoding.Unicode);
sb.Append(reader.ReadString());
sb.Append(str + "'r'n");
}
using (var stream = mmf1.CreateViewStream())
{
System.IO.BinaryWriter writer = new System.IO.BinaryWriter(stream, System.Text.Encoding.Unicode);
writer.Write(sb.ToString());
}
}
catch (Exception ex)
{
Debug.WriteLine("Unable to monitor memory file. " + ex);
}
}
我认为OpenExisting(String)
将打开一个名为MMF的,用于跨进程共享内存。我想你想要的是来自光盘的MMF,就像你从CreateFromFile(String)
得到的一样。如果您只需要一个新的MMF实例,请将null
作为名称传递给OpenExisting(String)
。
否则,也许你应该提出你的问题,这样我们才能更好地理解你的用例。