2011-10-10 75 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()返回時完成。