6

我知道我可以使用如下回调方法针对模式验证 xml,但是有没有一种方法可以同步而不是事件驱动?

我想到的一种方法是设置一个类成员布尔标志 IsValidated=false,然后
调用 xml.Validate(ValidationEventHandler)。一旦完成,事件处理程序将设置 IsValidated=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("After Validate"); 总是在执行 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

4 回答 4

6

您可以为 ValidationEventHandler 指定 null 以使 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;
    }
于 2011-10-16T20:33:18.080 回答
1

使用ManualResetEventSlim.

Set()回调中的事件,以及WaitOne()调用Validate().

于 2011-10-10T21:41:53.973 回答
0

我认为 M3NTA7 是对的,当我们担心它是异步的时,我们正在看这个错误。
不要忘记,您一开始并没有以异步方式调用 Validate(),因此您不会离开线程。

我们将“validationCallback”地址作为目标传递,以便我们可以自定义对验证中的任何错误的处理。
但是我相信调用验证回调委托的过程都是在对 Validate() 的同步调用中同步发生的。:)

所以这一切都会在 Validate() 返回时完成。

于 2014-03-31T15:37:54.850 回答
-4

如果有效,我将传入一个函数,该函数执行您需要它执行的操作,然后在正确完成验证后回调该函数。

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();
    }
于 2011-10-10T21:45:35.650 回答