CancellationToken
이 보다 가능성이 큽니다. 을 사용하면 서로 다른 수준의 T
이 서로 다른 경우가 많습니다 (상위 수준 async
방법은 하위 수준 await
통화의 진행 상태 알림을 결합 함). CancellationToken
을 사용하면 동일한 토큰이 거의 항상 하위 레벨 async
메쏘드로 전달됩니다 (소거가 지원된다고 가정 할 때). CancellationToken
은 일부 고급 조합기를 지원하지만 거의 사용하지 않습니다.
첫 번째 단점은 작업 기반 비동기 패턴에서 벗어나는 것입니다. Microsoft 또는 타사 코드는 명시 적으로 CancellationToken
을 취해야 함을 명심해야합니다. 가장 낮은 수준의 async
메서드에서 앰비언트 컨텍스트 외부로 명시 적으로 가져와야합니다. 또한 나중에 코드 기반을 유지하는 프로그래머는 TAP을 기대할 수 있습니다.
구현을 고려할 때 문제가 있습니다. 스레드 컨텍스트를 변경하더라도 암시적인 CancellationToken
이 async
메서드의 호출을 따르길 원할 것입니다. 제 말은 다음과 같습니다. A
메서드는 B
메서드의 결과를 기다리기 전에 ConfigureAwait(false)
메서드를 호출합니다. 한 스레드에서 다른 스레드로 비동기 실행 컨텍스트를 따라야하기 때문에 간단한 스레드 로컬 정적 속성을 사용할 수 없습니다.
(아마도 CallContext
클래스를 사용하여)이 작업을 수행하는 방법에 대해 읽은 것처럼 보이지만 실행하자마자 성능 탱크 (실행 컨텍스트 마이그레이션 코드는 기본 시나리오에 맞게 최적화되어 있습니다).
다시 해 주셔서 감사합니다. –
"아마도 CallContext 클래스를 사용하여이 작업을 수행하는 방법을 읽은 것 같습니다 ..."예, .NET 4.5의 현재 내부 빌드는이 기능을 지원합니다 ,하지만 이것은 // BUILD에서 릴리스 된 버전에는 없었습니다. –