是否有一种简单的方法来检查对XmlReader的ValidationEventHandler的所有调用是否已完成执行?
我假设XmlReader的XmlReaderSettings.ValidationEventHandler被异步调用?如果没有,问题就解决了。否则,到阅读器完成阅读时,并非对ValidationEventHandler的所有调用都已经完成。
我在ValidationCallBack方法中使用ConcurrentQueue作为ValidationEventHandler的处理程序,以编译验证错误和警告。验证xml后,我检查ConcurrentQueue的计数。我担心的是那时可能尚未运行对ValidationCallBack的调用,因此有可能尚未将验证错误记录在ConcurrentQueue中。可能会导致错误的肯定验证或在检查时丢失1个或多个错误。
是否有一种方法可以使验证结果与进行验证的方法同步?下面是我当前代码的简化版本。
static ConcurrentQueue<string> validationQ = new ConcurrentQueue<string>();
static string GenerateXml(Dictionary<string, object> data)
{
...
//generate xml
...
XmlReaderSettings settings = new XmlReaderSettings();
settings.Schemas.Add(xmlSchemaSet);
settings.ValidationEventHandler += ValidationCallBack;
settings.ValidationType = ValidationType.Schema;
settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
XmlReader reader = XmlReader.Create(stream, settings);
//Validate XML
while (reader.Read()) { }
if (validationQ.Count > 0)
{
throw new XmlSchemaValidationException(string.Concat(validationQ));
}
...
return result;
}
private static void ValidationCallBack(object sender, ValidationEventArgs args)
{
switch (args.Severity)
{
case XmlSeverityType.Warning:
validationQ.Enqueue(@" Warning: " + args.Message);
break;
default:
validationQ.Enqueue(@" Error: " + args.Message);
break;
}
}