나는 부울을 반환 취소 가능 이벤트를 제기 확장 방법을 가지고 :첫 번째 처리기가 취소 할 경우 취소 가능 이벤트 인수가 모든 처리기로 전달되어야합니까? 그들이 취소하는 경우
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;
을 가질 수 있습니다).
이전 핸들러가 예외를 throw하는 경우 나머지 핸들러를 호출해야하는지 여부를 묻는 것이 좋습니다. 나는 그들이 그렇다고 말해야한다. –
나는 벌써했다. http://stackoverflow.com/questions/3113822/raising-events-in-c-that-ignore-exceptions-raised-by-handlers. 이 코드는 아직 개발 중이며 아마도 내부 예외를 던지기를 추적 결과 또는 다른 것으로 대체 할 것입니다. – Flynn1179