이벤트 전달의 경쟁 조건
C#의 이벤트는 종종 다음 코드를 사용하여 전달됩니다.
public event EventHandler SomeEvent; ... { .... if(SomeEvent!=null)SomeEvent(); }
그러나 다중 스레드 환경에서는 이 접근 방식으로 인해 경쟁 조건이 발생할 수 있습니다. 발생 방법은 다음과 같습니다.
이 동시성 문제를 해결하려면 null을 확인하기 전에 호출 목록을 임시 변수에 복사하는 것이 가장 좋습니다.
protected virtual void OnSomeEvent(EventArgs args) { EventHandler ev = SomeEvent; if (ev != null) ev(this, args); }
이 접근 방식은 스레드로부터 안전합니다. 왜냐하면:
호출 목록을 복사하여, 복사본을 만든 후 이벤트 핸들러가 제거되더라도 이벤트 핸들러가 호출되도록 보장합니다. 그러나 이 솔루션은 존재하지 않는 이벤트 핸들러와 관련된 잠재적인 상태 문제를 해결하지 않는다는 점에 유의하는 것이 중요합니다.
위 내용은 C#에서 이벤트를 전달할 때 경쟁 조건을 방지하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!