高手进,可能是清除内存的问题

jcyluck 2008-02-15 06:55:35
string str = AppDomain.CurrentDomain.BaseDirectory
XmlDocument xmlDoc = new XmlDocument();
private void inquire_Load(object sender, EventArgs e)
{
xmlDoc.Load(str + "Control_console.xml");
XmlNode node = xmlDoc.SelectSingleNode(@"Console/" + _tablename + @"/tabcontrol");

for (int i = 0; i < node.ChildNodes.Count; i++)
{
if (tabControl1.TabPages.Count > i)
{
tabControl1.TabPages[i].Text = node.ChildNodes[i].Name;
}
else
{
tabControl1.TabPages.Add(node.ChildNodes[i].Name);
}
}
node = null;
}

private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)
{
GC.Collect();
this.Close();
}

上面的代码主要有三个步骤:
1.进入一个窗口后,读取一个XML文档的某个指定节点
2.将这个节点下的所有子节点的名称区分添加到tabControl的选项卡中

问题:
当用其他方式修改这个XML文档子节点的内容后,退出该窗口,当再次进入时,tabControl上不能读取修改后的内容,只有在退出程序后再进入才能读取到新的内容。
比如原来tabControl上有2个选顶卡,XML文件同样也是2个子节点,用其他方式增加一个子节点为3个,退出窗口再进入,选项卡不能获得新添加的节点值而仍然为2个,退出程序再进入,选项卡又能获得新的节点值为3个。

经过调试发现,问题出在node上,退出窗口再进入,node子节点的COUNT不是修改后的数量,退出程序再进入,COUNT数量正确。
这就奇怪了,XMLDOC和node在每次进入时都有初始化,应该是每加载窗口一次就读取一次文件,为什么还会出现这种问题?是不是和清除内存有关?
...全文
77 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
snc2010 2011-03-24
  • 打赏
  • 举报
回复
我用的是javascript,和您碰到了同样的问题,无法解决!
jcyluck 2008-02-16
  • 打赏
  • 举报
回复
明白了,这确实和内存有关
上面的代码,在退出窗口后,我删除了Control_console.xml这个文件,再进入窗口,依然能读取原XML文件内容,退出程序再进入,系统提示找不到XML文件
这就说明,XML文件被加载后一直储存在内存中,哪怕是硬盘中的文件被更新,内存中的XML文件不能同步更新。
那么有什么方法可以让这两个更新能保持同步呢
或者如何将XML文件从内存中卸载或直接在内存中修改。
jcyluck 2008-02-16
  • 打赏
  • 举报
回复
谢谢水月流影

这个其他方式修改具体是什么?你确定数据已经保存到xml文件了吗?
是用一个自编的XML编辑工具来修改的,数据肯定已经保存到文件了,也就是说在程序外修改的。

你每次都读了文件,但是也是每次都写了文件吗?
不明白这样问是什么意思。

lalac 2008-02-15
  • 打赏
  • 举报
回复
这个其他方式修改具体是什么?你确定数据已经保存到xml文件了吗?你每次都读了文件,但是也是每次都写了文件吗?

我根据你的描述写了一个示例,每次窗体退出就加一个TabPage,结果正确,没有问题:

private void Form1_Load(object sender, EventArgs e)
{
xmlDoc.Load(str + "Control_console.xml");
XmlNode node = xmlDoc.SelectSingleNode(@"Console/" + _tablename + @"/tabcontrol");

for (int i = 0; i < node.ChildNodes.Count; i++)
{
if (tabControl1.TabPages.Count > i)
{
tabControl1.TabPages[i].Text = node.ChildNodes[i].Name;
}
else
{
tabControl1.TabPages.Add(node.ChildNodes[i].Name);
}
}
node = null;
}

string str = AppDomain.CurrentDomain.BaseDirectory;
XmlDocument xmlDoc = new XmlDocument();

private void quitToolStripMenuItem_Click(object sender, EventArgs e)
{
GC.Collect();
this.Close();
}

private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
XmlNode node = xmlDoc.SelectSingleNode(@"Console/" + _tablename + @"/tabcontrol");
if (node != null)
{
XmlNode n = xmlDoc.CreateElement("Last");
node.AppendChild(n);
}
if (!string.IsNullOrEmpty(xmlDoc.InnerXml))
{
xmlDoc.Save(str + "Control_console.xml");
}
}

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧