【问题标题】:Consume disposed Memory Mapped File使用已处理的内存映射文件
【发布时间】:2012-03-09 09:34:12
【问题描述】:

如果这是一个糟糕的问题,请原谅我,因为我不擅长内存映射文件。我在我的项目中使用内存映射文件。我正在跟踪正在进行的文件和已在内存映射文件中处理的文件。我有两个内存映射文件。在第一个内存映射文件中,我跟踪已处理的文件,在第二个内存映射文件中,我跟踪正在处理的文件。因此,当对特定文件的处理完成时,我在第一个内存映射文件中创建一个条目,并从第二个映射文件中删除该条目。现在的问题是,如果所有文件都被处理,我正在处理第二个内存映射文件对象。但是当用户添加更多文件进行处理时,我正在初始化一个新的内存映射文件对象,其名称与第二个内存映射文件名相同。当我尝试访问第二个文件时,它给出了一个异常“安全句柄已关闭”

请注意:我必须处理第二个内存映射文件对象。

请提出建议。

第一次更新 写入第一个内存映射文件的函数

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);
            }
}

【问题讨论】:

  • 拜托,我们需要的是代码,而不是文字。
  • 我明白,但我不能在这里发布整个项目。
  • 确实,只发布相关代码。
  • 一个 mmf 有 99% 的时间使用了错误的类,+/- 1%。首先使其适用于常规文件。
  • 嗯,错误消息安全句柄已关闭表明您在调用mmf.Dispose() 后的某个时间点尝试访问该文件。在第二次调用中通过Class1obj.CreateMMFFile1 并仔细查看那里的对象。

标签: c# memory-mapped-files


【解决方案1】:

我认为OpenExisting(String) 会打开一个名为 MMF,用于跨进程共享内存。我认为您想要的是来自光盘的 MMF,就像您从 CreateFromFile(String) 获得的一样。如果您只需要一个新的 MMF 实例,请将 null 作为名称传递给 OpenExisting(String)

否则,也许您应该提出您的问题,以便我们更好地了解您的用例。

【讨论】:

  • 原来的发帖人似乎在过去 8 年里就明白了这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-18
  • 1970-01-01
  • 2011-10-11
  • 2013-02-17
  • 2011-05-02
  • 2011-05-11
相关资源
最近更新 更多