2008-11-17 19 views
9

Trong System.ComponentModel, có một lớp được gọi là CancelEventArgs chứa một thành viên Hủy có thể được đặt trong trình lắng nghe sự kiện. Tài liệu trên MSDN giải thích cách sử dụng điều đó để hủy sự kiện từ bên trong một người nghe, nhưng làm cách nào để sử dụng nó để thực hiện các sự kiện có thể hủy của riêng tôi? Có cách nào để kiểm tra thành viên Hủy sau mỗi vụ cháy người nghe hay tôi phải đợi cho đến sau khi sự kiện đã kích hoạt tất cả người nghe của mình?Làm cách nào để triển khai sự kiện có thể hủy?

Trả lời

16

Để kiểm tra từng nghe đến lượt nó, bạn cần phải tự có được xử lý qua GetInvocationList:

class Foo 
{ 
    public event CancelEventHandler Bar; 

    protected void OnBar() 
    { 
     bool cancel = false; 
     CancelEventHandler handler = Bar; 
     if (handler != null) 
     { 
      CancelEventArgs args = new CancelEventArgs(cancel); 
      foreach (CancelEventHandler tmp in handler.GetInvocationList()) 
      { 
       tmp(this, args); 
       if (args.Cancel) 
       { 
        cancel = true; 
        break; 
       } 
      } 
     } 
     if(!cancel) { /* ... */ } 
    } 
} 
+5

Trong khi mã này sẽ làm việc, đó là hoạt động bình thường của một CancelEventHandler? Không phải chúng thường được sử dụng trong một mẫu BeforeX, AfterX, nếu bất cứ điều gì trong Before đặt Canel, thì X không xảy ra nên AfterX không được gọi. Tại sao việc dừng các thính giả khác lại nhận được sự kiện Trước là điều quan trọng? –

+0

Tôi cũng muốn biết câu trả lời cho nhận xét ở trên về việc tại sao điều quan trọng là phải dừng những người nghe khác nhận được sự kiện Trước đó. – MPavlak

+3

Hãy tưởng tượng hai người đăng ký vào cùng một sự kiện (trong cùng một đối tượng). Một bộ 'cancel = true' và cái thứ hai là" cancel = false ". Bạn nghĩ điều gì sẽ xảy ra? Câu trả lời cho thấy cách tránh tình huống như vậy. Nếu ít nhất một người đăng ký hủy sự kiện thì sự kiện đó sẽ bị hủy. Giai đoạn. – Joel

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