2011-04-07 2 views
1

나는 부울을 반환 취소 가능 이벤트를 제기 확장 방법을 가지고 :첫 번째 처리기가 취소 할 경우 취소 가능 이벤트 인수가 모든 처리기로 전달되어야합니까? 그들이 취소하는 경우

public static bool RaiseCancel<T>(this EventHandler<T> ev, object sender, T e) where T : CancelEventArgs 
{ 
    if (ev == null) 
    { 
     return false; 
    } 

    foreach (Delegate del in ev.GetInvocationList()) 
    { 
     try 
     { 
      ISynchronizeInvoke invoke = del.Target as ISynchronizeInvoke; 
      if (invoke != null && invoke.InvokeRequired) 
      { 
       invoke.Invoke(del, new[] { sender, e }); 
      } 
      else 
      { 
       del.DynamicInvoke(sender, e); 
      } 
     } 
     catch (TargetInvocationException ex) 
     { 
      throw ex.InnerException; 
     } 

     // if (e.Cancel) return true; 
    } 

    return e.Cancel; 
} 

을하지만, 나는 핸들러를 위해 그것을 취소 할 때 즉시 반환해야합니다 생각을 떨칠 수 없다 나머지 처리기를 계속 호출하는 것이 아니라 효율성을 높입니다. 지금까지 알고있는 한 취소 가능한 이벤트 핸들러는 Cancel 속성을 true로 설정하는 것 이외의 다른 조치를 취하지 않아야합니다. 그렇다면, 더 많은 핸들러에게 이미 결정을 내리는 것이 무엇이겠습니까? 반면에 객체가 이벤트를 기다리고 있다면 이벤트 핸들러를 호출하지 않는 것이 좋지 않은 것 같습니다.

if 문에서 주석을 제거하고 (메서드 끝에있는 return을 return false;으로 바꿔야합니까?)?

EDIT : 처리기를 계속 호출 할 예정이라면 처리기가 스스로 결정을 내릴 수 있도록해야합니다 (즉, 처리기 시작 부분에 if (e.Cancel) return;을 가질 수 있습니다).

+0

이전 핸들러가 예외를 throw하는 경우 나머지 핸들러를 호출해야하는지 여부를 묻는 것이 좋습니다. 나는 그들이 그렇다고 말해야한다. –

+0

나는 벌써했다. http://stackoverflow.com/questions/3113822/raising-events-in-c-that-ignore-exceptions-raised-by-handlers. 이 코드는 아직 개발 중이며 아마도 내부 예외를 던지기를 추적 결과 또는 다른 것으로 대체 할 것입니다. – Flynn1179

답변

3

참고 : 여기서 설명하는 것은 내가 생각하는 것입니다. .NET 프레임 워크에서이 방법으로 구현되지 않을 수도 있습니다 (아래 João Angelo의 설명 참조)

예 : FormClosing 이벤트를 취하십시오. 처리기가이 이벤트를 취소하면 양식이 닫히지 않으므로 양식이 닫히고 있음을 다른 처리기에 알리는 것은 의미가 없습니다. 당신이 e.Cancel가 true로 설정되어있는 다른 핸들러 이후에 호출하면 더 일반적인 경우

, 당신은 그래서

에 ... 더 이상 발생하지 않는 뭔가를 통지하고 제 생각에는 e.Cancel이 true로 설정되는 즉시 핸들러 호출을 중단해야합니다.

+0

IIRC,'FormClosing'은 모든 핸들러를 호출하고 두 번째 핸들러는'e.Cancel = false; '를 설정하여 이전 취소를 취소 할 수 있습니다. –

+0

@ João Angelo, 실제로 나는 확인하지 않았다 ... 나는 단지 나에게 의미가있는 행동을 묘사했다. –

+0

항상 그런 것은 아니지만? 후속 처리기에서'e.Cancel'을 false로 설정하는 것을 중단시키는 것은 무엇입니까? 그리고 그렇게하는 것이 반사회적이지 않습니까? 이 이전 처리기에서 이벤트를 취소해야하는 경우 어떻게해야합니까? – Flynn1179