CancellationToken은 어떻게 취소 통지를 받는가?

마수리·2023년 10월 12일
0
post-thumbnail

C# 에서는 비동기 작업에 대한 취소요청을 CancellationTokenSourceCancellationToken 을 이용해서 할 수 있게 되어있다.

지금까지 어렴풋하게 알고 있는 사실은 CancellationTokenCancellationTokenSource라는 것에 의해 생성되고 CancellationTokenSource에서 Cancel()을 호출하면 CancellationTokenSource가 발행했던 CancellationToken이 모두 취소 된다는 것이다.
CancellationToken을 사용하는 비동기 함수에서는 CancellationToken이 취소 되었는지 확인하고 취소 여부에 따라 올바로 함수에서 리턴할 수 있도록 작성해줘야 한다.

하지만 저자는 여기서 의문점이 드는 점이 있었다.
CancellationToken 비동기 매소드에 파라미터로 전달되는 형식으로 사용되는데 이 객체는 구조체로써 값 타입니다.
구조체를 파라미터로 넘기면 값이 복사되고(call by value) 함수 밖에서 파라미터로 전달 한 값의 값을 아무리 변경하여도 함수 안에서는 전혀 영향이 없다.

이렇게 값 타입으로 넘겨지는 CancellationToken이 어떻게 함수 밖에서 변경되는 취소 상태에대해서 올바로 통지 받을 수 있는 것일까?

어떻게 동작하는지 알기 위해 실제로 소스코드를 확인해 보자!

CancellationTokenSource에서 CancellationToken을 생성하는 프로퍼티는 아래와 같이 작성 되어 있다.

CancellationTokenSource에서 CancellationToken을 반환하는 Token 프로퍼티는 new 키워드를 이용해서 CancellationToken을 생성한다.

여기서 주목해야할 점은 파라미터로 CancellationToken을 만든 CancellationTokenSource의 주소 값을 넘긴다는 것이다.

그럼 CancellationToken은 파라미터로 받은 값을 어떻게 사용할까?

소스코드를 확인해보면 답이 있을 것이다.

CancellationToken은 자기 자신을 만든 CancellationTokenSource를 private filed로 가지고 있고 CancellationToken에게 IsCancellationRequested 프로퍼티로 취소 여부를 묻는다면 자기 자신을 만든 CancellationTokenSourceIsCancellationRequested의 값을 가져와 리턴하는 것이다.


결론

-. CancellationToken이 만들어질 때 자기 자신을 만든 CancellationTokenSource의 주소 값을 파라미터로 받아 갖고있는다.
-. CancellationToken의 취소 여부를 묻는다면 자기 자신을 만든 CancellationTokenSource의 취소 여부값을 리턴해준다.

이렇게 되면 CancellationToken이 아무리 구조체여도 내부에 자기 자신을 만든 CancellationTokenSource를 참조하고 있으므로 함수 밖에서 CancellationTokenSourceCancel() 함수가 호출된다면 CancellationToken에서 취소 여부를 알 수 있게 된다.

profile
.NET 개발자 마수리입니다 🖐

0개의 댓글