2011-10-10 40 views
5

Tôi biết tôi có thể xác thực xml dựa vào lược đồ bằng cách sử dụng phương thức gọi lại như sau, nhưng có cách nào để tôi có thể thực hiện đồng bộ thay vì hướng sự kiện không?Xác thực lược đồ XML đồng bộ? NET 3.5

Một cách tôi nghĩ là đặt cờ boolean thành viên của lớp IsValidated = false rồi
gọi xml.Validate (ValidationEventHandler). Trình xử lý sự kiện sẽ thiết lập IsValidated = true khi nó kết thúc. Trong thời gian đó, hãy kiểm tra vòng lặp cho đến khi cờ được đặt thành true sau đó tiếp tục.

Điều này dành cho .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, tôi đã thực hiện kiểm tra và có vẻ như xml.validate thực sự đợi cho đến khi cuộc gọi hoàn tất trước khi mã mới được thực thi.

Trong ví dụ sau, MessageBox.Show ("Sau khi xác thực"); luôn xảy ra sau khi thực hiện myValidationEventHandler.

Tôi cũng đã thực hiện qua mã để xác minh điều này.

Vì vậy, tôi đoán điều đó làm cho câu hỏi của tôi không thành vấn đề.

// 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

Tôi nghĩ bạn đã mắc lỗi đánh máy, nghĩa là "làm điều đó một cách không đồng bộ" thay vì "thực hiện đồng bộ", phải không? – ggPeti

+1

Tôi không hiểu ý bạn là gì. Điều này _is_ đồng bộ. Và 'ValidationEventHandler' được gọi đồng bộ khi tìm thấy lỗi hoặc cảnh báo. Bạn muốn gì? –

+0

Bằng cách đồng bộ, tôi có nghĩa là tôi không muốn tiếp tục cho đến khi tôi biết nếu một lỗi được tìm thấy hay không bởi vì tôi muốn căn cứ vào logic tiếp theo về việc liệu có lỗi hay không. Với người xử lý sự kiện, tôi không biết khi nào sự kiện có thể cháy, do đó tôi cần đợi cho đến khi nó xảy ra trước khi tiếp tục. – M3NTA7

Trả lời

1

Sử dụng ManualResetEventSlim.

Set() sự kiện trong gọi lại và WaitOne() sau khi gọi Validate().

+0

Đó là hướng tôi đang tìm kiếm.Điều đó hoặc thậm chí một cái gì đó mà không có sự kiện lý tưởng. Về cơ bản, tôi chỉ muốn treo xung quanh cho đến khi xác nhận hoàn tất. Một lưu ý khác, tôi đang sử dụng NET 3.5. Xin lỗi tôi đã không đề cập đến điều đó. Tôi sẽ cập nhật câu hỏi của mình. – M3NTA7

+0

Chỉ cần xóa 'Slim' để sử dụng phiên bản cũ hơn, chậm hơn. – SLaks

-4

Tôi sẽ chuyển một chức năng thực hiện những gì bạn cần để thực hiện nếu Hợp lệ, sau đó điều này sẽ gọi lại cho đến khi xác thực hoàn thành chính xác.

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 trả về void. – M3NTA7

4

Bạn có thể chỉ định null cho ValidationEventHandler để có phương thức Xác thực ném một ngoại lệ.

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

Tôi nghĩ M3NTA7 đúng là chúng tôi đang xem xét sai khi chúng tôi lo lắng về việc không đồng bộ.
Đừng quên, bạn không gọi Validate() theo cách không đồng bộ ở địa điểm đầu tiên, vì vậy bạn không rời khỏi chuỗi.

Chúng tôi chuyển địa chỉ "validationCallback" làm mục tiêu để chúng tôi có thể tùy chỉnh việc xử lý bất kỳ lỗi nào khi xác thực.
Nhưng quá trình gọi đại biểu gọi lại xác thực tất cả xảy ra tôi tin đồng bộ bên trong cuộc gọi đồng bộ để Validate(). :)

Vì vậy, tất cả sẽ được thực hiện khi Validate() trả về.

Các vấn đề liên quan