2011-10-10 8 views
5

私は、次のようなコールバックメソッドを使用してスキーマに対してxmlを検証できますが、イベントドリブンではなく同期的に行うことができる方法はありますか?同期XMLスキーマの検証? .NET 3.5

私はクラスメンバのブール値フラグを設定することを考えています。IsValidated = false then
xml.Validate(ValidationEventHandler)を呼び出します。イベントハンドラは、終了後にIsValidated = trueを設定します。その間に、フラグがtrueに設定されてからcontinueになるまでループチェックを行います。

これは.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); 
    } 

[OK]を、私はテストを行っている、新しいコードが実行される前にコールバックが完了するまで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

私はあなたが何を意味するか分かりません。これは同期的です。また、ValidationEventHandlerは、エラーまたは警告が検出されたときに同期的に呼び出されます。代わりに何をしたいですか? –

+0

同期では、エラーがあるかどうかを知るまで続行したくないということです。なぜなら、エラーがあったかどうかを後続のロジックに基づいているからです。イベントハンドラでは、イベントがいつ発生するかはわかりません。したがって、続行する前にイベントが発生するまで待つ必要があります。 – M3NTA7

答えて

1

ManualResetEventSlimを使用してください。

Set()コールバックのイベント、およびValidate()を呼び出した後のWaitOne()です。

+0

それは私が探していた方向です。それは理想的にはイベントのないものです。基本的には、妥当性検査が完了するまでぶら下がりたいだけです。もう一つのメモ、.NET 3.5を使用しています。申し訳ありませんが、私はそれについて言及しませんでした。私は私の質問を更新します。 – M3NTA7

+0

古い、より遅いバージョンを使うには 'Slim'を削除してください。 – 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

ValidateEventHandlerに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

私はそれが非同期であることを心配するとき、私たちがこの間違っていることを見ていると思います。
最初に非同期の方法でValidate()を呼び出すのではなく、スレッドを離れることはないということを忘れないでください。

"validationCallback"アドレスをターゲットとして渡します。これにより、検証からのエラーの処理をカスタマイズできます。
しかし、検証コールバックデリゲートを呼び出すそのプロセスは、同期呼び出しでValidate()に同期していると考えられます。 :)

これは、Validate()が返されたときにすべて実行されます。

関連する問題