【发布时间】:2011-02-11 00:57:57
【问题描述】:
我正在使用一个异步委托,它调用一个将 xml 文件加载到 XPathDocument 中的方法。如果 xml 太大而无法放入内存,则它永远不会完成加载。如果 xml 文件成功加载到 XPathDocument 中,则以下代码有效。我已经能够使用一个计时器事件来执行 asyncXpath.EndInvoke(result) 语句并且可以结束 CreateDocument 方法,但它不会停止加载 XPathDocument。我的结论是,我唯一能做的就是发出 Application.End 语句来终止应用程序。有谁知道如何停止黑盒操作,例如加载 XPathDocument。
delegate bool AsyncXpathQueryCaller(string xmlfile
bool found = false;
AsyncXpathQueryCaller asyncXpath = new
AsyncXpathQueryCaller(CreateDocument);
IAsyncResult result = asyncXpath.BeginInvoke(xmlfile, null, null);
while (!result.IsCompleted)
{
result.AsyncWaitHandle.WaitOne(100, false);
}
found = asyncXpath.EndInvoke(result);
private bool CreateDocument (string xmlfile)
{
XPathDocument doc = new XPathDocument(xmlfile);
}
【问题讨论】:
-
如果文档那么大,我建议使用只进阅读器来读取/处理数据。这会更快,并且在您阅读文件时如有必要也可以中断。
-
@Tim - 创建 XPathDocument 对象的方法只有这么多,所有这些都涉及让构造函数控制文件加载。
-
@KeithS - 我在想更多的 XmlReader ...如果有问题的文档那么大,它可以分块读取,如果一次需要一个块,可以转换/解析/等。不确定它是否适合这种情况,这就是我发表评论而不是答案的原因。
-
我需要在加载 xml 后进行 xpath 查询,并且我需要向后看的轴,例如祖先::,所以 XPathDocument 或 XmlDocument 是我唯一的选择(在 .net 中)。
-
那么,你是在问如何杀死一个线程?因为我想我听说你不能在不杀死整个过程的情况下可靠地做到这一点......