2011-10-10 70 views
5

我知道我可以使用类似下面的回调方法验证xml的模式,但有没有一种方法可以同步执行而不是事件驱动?同步XML模式验证? .NET 3.5

我想到的一种方法是设置一个类成员布尔标志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 
    } 
+1

我认为你犯了一个错字,你的意思是“不同步做”而不是“同步做”,不是吗? – ggPeti

+1

我不明白你的意思。这是_is_同步。当发现错误或警告时,会同步调用“ValidationEventHandler”。你想要什么? –

+0

通过同步,我的意思是我不想继续下去,直到我知道是否发现错误,因为我想根据后续的逻辑判断是否有错误。通过事件处理程序,我不知道事件何时可能会触发,因此我需要等到它启动才能继续。 – M3NTA7

回答

1

使用ManualResetEventSlim

Set()该事件在回调中,而WaitOne()在致电Validate()后。

+0

这就是我一直在寻找的方向。这或甚至没有理想的事件。基本上,我只是想等待验证完成。另一个说明,我使用.NET 3.5抱歉,我没有提到这一点。我会更新我的问题。 – M3NTA7

+0

只要删除'苗条'使用较旧,较慢的版本。 – SLaks

-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(); 
    } 
+0

xml.Validate返回void。 – M3NTA7

4

您可以为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; 
    } 
0

我认为M3NTA7是正确的,当我们担心它是异步的时候我们会看到这个错误。
不要忘记,你并没有首先以异步方式调用Validate(),所以你不会离开线程。

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

因此,所有这些都将在Validate()返回时完成。