Есть ли простой способ проверить, все ли вызовы ValidationEventHandler для XmlReader завершили выполнение?
Я предполагаю, что XmlReaderSettings.ValidationEventHandler для XmlReader вызывается асинхронно? Если нет, то проблема решена. В противном случае не все вызовы ValidationEventHandler могут быть завершены к тому времени, когда читатель завершит чтение.
Я использую ConcurrentQueue в методе ValidationCallBack в качестве обработчика для 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;
}
}