Task.FromResult가 싱글톤을 반환할 수 있음
이제 Task.FromResult<TResult>(TResult)에서 항상 새 인스턴스를 만드는 대신 캐시된 Task<TResult> 인스턴스를 반환할 수 있습니다.
이전 동작
이전 버전에서 Task.FromResult<TResult>(TResult)에서는 T
유형이나 결과 값에 상관없이 항상 새 Task<TResult>을 할당했습니다.
새 동작
일부 T
유형과 일부 결과 값에 대해 Task.FromResult<TResult>(TResult)에서는 새 개체를 할당하는 대신 캐시된 싱글톤 개체를 반환할 수 있습니다. 예를 들어 Task.FromResult(true)
에 대한 모든 호출은 동일한 이미 완료된 Task<bool>
개체를 반환할 확률이 높습니다.
도입된 버전
.NET 6
호환성이 손상되는 변경의 형식
이 변경은 이진 호환성에 영향을 줄 수 있습니다.
변경 이유
대부분의 개발자는 Task.FromResult<TResult>(TResult)이 이러한 캐싱을 이미 수행한 비동기 메서드와 비슷한 방식으로 동작하길 기대합니다. 할당 동작을 알고 있는 개발자는 대부분 자체 캐시를 유지하여, 이렇게 자주 사용하는 값에 항상 할당하는 데 드는 성능 비용을 방지합니다. 예시:
private static readonly Task<bool> s_trueTask = Task.FromResult(true);
이제 Boolean 및 작은 Int32 값에는 이러한 사용자 지정 캐시가 필요 없습니다.
권장 작업
이 변경은 사용자가 참조 같음을 사용하여 특정 Task
인스턴스가 다른 Task
인스턴스와 동일한지 확인할 때만 영향을 미칩니다. 참조 같음을 사용하며 이러한 확인 작업을 계속해야 한다면 다음 코드를 사용하여 항상 고유한 Task<TResult> 인스턴스가 반환되게 하세요.
private static Task<T> NewInstanceFromResult<T>(T result)
{
var tcs = new TaskCompletionSource<T>();
tcs.TrySetResult(result);
return tcs.Task;
}
참고 항목
이 패턴은 Task.FromResult(result)
만 사용하는 방법보다 효율성이 훨씬 낮으며 정말로 필요한 경우에만 사용해야 합니다.
영향을 받는 API
.NET
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기