Синхронная проверка XML-схемы? .NET 3.5 - PullRequest
6 голосов
/ 11 октября 2011

Я знаю, что могу проверить xml по схеме, используя метод обратного вызова, как показано ниже, но есть ли способ сделать это синхронно, а не по событию?

Один из способов, о котором я подумал, - установить логический флаг члена класса IsValidated = false, тогда
вызовите xml.Validate (ValidationEventHandler). Обработчик события установит IsValidated = true после завершения. В то же время выполните проверку цикла, пока для флага не будет установлено значение true, затем продолжите.

Это для .Net 3.5.

    public bool ValidateSchema(string xmlPath, string xsdPath)
    {
        XmlDocument xml = new XmlDocument();
        xml.Load(xmlPath);

        xml.Schemas.Add(null, xsdPath);

        xml.Validate(ValidationEventHandler); 
    }

Хорошо, я выполнил тест, и похоже, что xml.validate действительно ожидает завершения обратного вызова, прежде чем будет выполнен новый код.

В следующем примере MessageBox.Show («После проверки»); всегда происходит после выполнения myValidationEventHandler.

Я также прошел через код, чтобы проверить это.

Так что, я думаю, это делает мой вопрос несущественным.

// load etc.
...

xmlValidate(myValidationEventHandler);

MessageBox.Show("After Validate");


    private void myValidationEventHandler(object sender, ValidationEventArgs e)
    {
        for (double i = 0; i < 100000; i++)
        {
            textBox1.Text = i.ToString();
            Application.DoEvents();
        }

    // do stuff with e
    }

Ответы [ 4 ]

5 голосов
/ 17 октября 2011

Вы можете указать null для ValidationEventHandler, чтобы метод Validate выдал исключение.

    public bool ValidateSchema(string xmlPath, string xsdPath)
    {
        XmlDocument xml = new XmlDocument();
        xml.Load(xmlPath);

        xml.Schemas.Add(null, xsdPath);

        try
        {
            xml.Validate(null);
        }
        catch (XmlSchemaValidationException)
        {
            return false;
        }
        return true;
    }
1 голос
/ 11 октября 2011

Используйте ManualResetEventSlim.

Set() событие в обратном вызове и WaitOne() после вызова Validate().

0 голосов
/ 31 марта 2014

Я думаю, что M3NTA7 прав, что мы смотрим на это неправильно, когда беспокоимся о его асинхронности.
Не забывайте, что вы в первую очередь не вызываете Validate () асинхронным образом, так что выне покидаем поток.

Мы передаем адрес «validationCallback» как цель, чтобы мы могли настроить обработку любых ошибок из проверки.
Но этот процесс вызова делегата обратного вызова проверки все происходитЯ считаю, что синхронно внутри синхронного вызова Validate ().:)

Так что все будет сделано, когда Validate () вернется.

0 голосов
/ 11 октября 2011

Я бы передал функцию, которая делает то, что вам нужно, если она действительна, то после этого она вернется к ней, как только завершит корректную проверку.

public void ValidateSchema(string xmlPath, string xsdPath, Action Success)
    {
        XmlDocument xml = new XmlDocument();
        xml.Load(xmlPath);

        xml.Schemas.Add(null, xsdPath);

        if( xml.Validate(ValidationEventHandler) ) Success();
    }
...