이벤트에 대한 구독자가 많은 구성 요소에서 비동기 이벤트 전달을 수행하기위한 옵션을 찾고 있습니다. 옵션을 정독하고, 난이 예제 가로 질러 :이 심각한 리소스 누수처럼비동기 적으로 이벤트 발생
public event ValueChangedEvent ValueChanged;
public void FireEventAsync(EventArgs e)
{
Delegate[] delegates = ValueChanged.GetInvocationList();
foreach (Delegate d in delegates)
{
ValueChangedEvent ev = (ValueChangedEvent)d;
ev.BeginInvoke(e, null, null);
}
}
을 이전 구문을 넘어 (샘플 .NET 1.1에서했다), 그것은 나에게 보인다. 완료 방법, 완료를위한 폴링 또는 기타 방법으로 EndInvoke
이 호출됩니다.
제 생각에 모든 BeginInvoke
에는에 해당하는 EndInvoke
이 있어야합니다. 그렇지 않으면 보류중인 AsyncResult
개체 인스턴스가 비동기 이벤트 중에 제기 된 예외와 함께 (잠재적으로) 부동 상태입니다.
콜백을 제공하고 EndInvoke
을 수행하는 것으로 변경하기는 쉽지만 실현할 필요는 없다는 것을 알고 있습니다. . .
비동기 exeptions 처리는 완전히 다른 문제이며 UI 스레드 (즉, InvokeRequired
등)와 동기화해야하는 필요성과 결합하여 이러한 비동기 알림을 수행하는 전체 아이디어를 수용 할 수 있습니다.
그래서, 두 가지 질문 : 나는 모든 BeginInvoke
는이 EndInvoke
대응이 필요하다는 믿음에 수정
- 건가요?
- 위에서 언급 한 것 외에 Windows Forms 응용 프로그램에서 비동기 이벤트 알림을 수행하는 데있어 다른 함정이 있습니까? 반환 유형이 지정된 경우
왜 비동기로 발송 하시겠습니까? 이것이 효과가 있다는 것을 보여주는 성과 분석을 했습니까? 그렇지 않으면 여러 스레드로 인해 성능이 저하 될 수 있습니다. –
예, 성능 분석을 통해 비동기 처리가 이점이 있는지를 확인했습니다. –