다음을 통해 공유


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