C# 에서 델리게이트는 함수를 타입화 한 것이다.
자주 사용하게 되는 델리게이트를 템플릿화 한 것
멀티 스레드에서의 문제는 다음과 같다.
if(ExampleEvent != null) // 여기서는 문제 없었는데
{
// 여기서 다른 스레드가 구독을 취소해서 null이 됨!
ExampleEvent(); // NullReferenceException!
}
이런 복잡한 문제는 검출이 어렵기에 '복사 후 실행' 이란 방법을 통해 예방할 수 있다.
var CopiedEvent = ExampleEvent;
if(CopiedEvent != null)
{
// 여기서 ExampleEvent 구독 취소 해도 문제 X
CopiedEvent();
}
좀 더 간결한 표현을 위해 null 조건부 연산자 (?.)를 사용할 수 있다.
ExampleEvent?.Invoke();
null 조건부 연산자 (?.)의 경우 원자적으로 수행이 되는 연산자라서 이 연산 도중 다른 스레드가 개입할 여지가 없어 멀티 스레드 환경에서도 안전하게 돌아가게 된다.