Проблемы параллелизма .NET XmlReader ValidationEventHandler - PullRequest
0 голосов
/ 09 ноября 2018

Есть ли простой способ проверить, все ли вызовы 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;
    }
}
...