7

如何“处置”一个 XDocument 对象?我正在使用它来解析 XML 字符串,然后将文件保存到文件系统。然后我需要以同样的方法访问该文件并在其上运行命令行工具。

代码如下:

string filepath = "...";
string filename = "...";
XDocument xdoc = XDocument.Parse(xmlString);
xdoc.Save(filepath + filename);

Process p = Process.Start(new ProcessStartInfo("rst.exe", args)); // the args use the file saved above

我在调用命令行工具的行上放了一个断点,然后尝试自己手动打开文件,但在我停止调试器之前它不会加载。

编辑:感谢您的回答。我已经缩小了问题的范围.. 保存文件后,在“进程 p = ...”上设置断点,我可以打开文件,但无法使用http://qualifiedapppath/path/file.xml和命令行访问它我正在使用的工具将只接受 URL 作为参数。停止调试器后,我可以通过 http 访问该文件。在方法运行时,什么进程阻止了对它的访问?

4

3 回答 3

6

XDocument 是一个存储 XML 文档的内存副本的类。类实现 IDisposable 是因为它们使用内存以外的非托管资源。垃圾收集器已经可以很好地管理内存。

由于 XDocument 只消耗内存,因此不需要 Dispose 方法。

于 2012-10-13T17:06:58.523 回答
3

不,你没有——它甚至没有实现 IDisposable。XDocument 和 XElement 类在后台使用 XmlReader 并为您处理底层阅读器的处置。只需右键单击 XDocument 类并选择Go To Definition,您可能找不到该类实现的 IDisposable 。

要回收内存,请将 XDocument 对象引用设置为 null,GC 将重新收集获取的内存。

添加:

对于您问题的第二部分,如果文件以这种方式在本地可用,请使用此 Uri:

var uri = new Uri("file:///C:/path/file.xml");

您还可以使用以下代码验证文件位置:

if (uri.IsFile)
{
    var filePath = uri.LocalPath; // C:/path/file.xml
}

如果您在 IIS 中配置虚拟目录来定位该文件,则可以使用 HTTP。

于 2012-10-13T16:56:16.683 回答
1

它没有实现 IDisposable 因此如果您只想释放它的内存,请将所有引用设置为 null 并且垃圾收集器将在需要时将其删除。

于 2012-10-13T16:57:32.270 回答