XmlDocument.Save从GC线程抛出的未处理异常

时间:2011-12-02 10:07:11

标签: .net garbage-collection

我开发了一个简单的应用程序,当我尝试将XMLDocument保存到没有足够可用空间的拇指驱动器时,会发生奇怪的事情。虽然我已经为XMLDocument.Save(filePath)添加了“try catch”子句,但我仍然得到一个未处理的异常,并且似乎从GC终结线程抛出异常(似乎GC尝试刷新磁盘没有的另外4096个字节)。我认为这是使用XMLDocument对象的常见场景,我想知道出了什么问题?

代码段:

XmlDocument query = new XmlDocument();
query.Load("g:\\test.xml");
... //modify the content of query to make it bigger
try
{
  query.Save("g:\\test.xml");
}
catch(Exception ex)
{}

异常堆栈跟踪如下:

  

mscorlib.dll!System.IO .__ Error.WinIOError(int errorCode = 112,string maybeFullPath =“”)+ 0x498 bytes       mscorlib.dll!System.IO.FileStream.WriteCore(byte [] buffer,int offset,int count)+ 0x119 bytes       mscorlib.dll!System.IO.FileStream.FlushWrite(bool calledFromFinalizer)+ 0x22 bytes       mscorlib.dll!System.IO.FileStream.Dispose(bool disposing = false)+ 0x57 bytes
      mscorlib.dll!System.IO.FileStream.Finalize()+ 0x1b bytes

1 个答案:

答案 0 :(得分:5)

嗯,问题是某些代码某处在使用它时没有处置FileStream。当FileStream完成时,它正在尝试刷新数据 - 此时抛出异常。

如果这真的是你的所有代码,它听起来就像它是XmlDocument.Save()中的一个错误,它应该在返回之前关闭所有的流。您可以通过自己打开FileStream(使用using语句)并将流传递到XmlDocument.Save来解决此问题。