.NET XmlReader ValidationEventHandler并发问题

时间:2018-11-09 16:02:19

标签: .net xmlreader xml-validation data-synchronization

是否有一种简单的方法来检查对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;
    }
}

0 个答案:

没有答案