ValueTask<TResult> 구조체

정의

Task<TResult> TResult래핑하는 값 형식을 제공하며 그 중 하나만 사용됩니다.

generic <typename TResult>
public value class ValueTask : IEquatable<System::Threading::Tasks::ValueTask<TResult>>
public readonly struct ValueTask<TResult> : IEquatable<System.Threading.Tasks.ValueTask<TResult>>
type ValueTask<'Result> = struct
Public Structure ValueTask(Of TResult)
Implements IEquatable(Of ValueTask(Of TResult))

형식 매개 변수

TResult

결과.

상속
ValueTask<TResult>
구현
IEquatable<ValueTask<TResult>>

설명

인스턴스가 ValueTask<TResult> 대기 중이거나 usingAsTaskTask<TResult> 변환될 수 있습니다. 인스턴스는 ValueTask<TResult> 한 번만 대기할 수 있으며, 소비자는 인스턴스가 완료될 때까지 읽을 Result 수 없습니다. 이러한 제한 사항이 허용되지 ValueTask<TResult> 않는 경우 호출AsTask하여 변환 Task<TResult> 합니다.

인스턴스에서 다음 작업을 수행 ValueTask<TResult> 해서는 안 됩니다.

  • 인스턴스를 여러 번 대기합니다.
  • 여러 번 호출 AsTask 합니다.
  • .Result 작업이 아직 완료되지 않은 경우 또는 .GetAwaiter().GetResult() 사용하거나 여러 번 사용합니다.
  • 이러한 기술 중 하나 이상을 사용하여 인스턴스를 사용합니다.

위의 작업을 수행하면 결과가 정의되지 않습니다.

메서드는 작업 결과를 동기적으로 사용할 수 있을 가능성이 높고 호출이 너무 자주 호출될 것으로 예상되는 경우 각 호출에 대해 새 Task<TResult> 항목을 할당하는 데 드는 비용이 엄청나게 많은 경우 이 값 형식의 인스턴스를 반환할 수 있습니다.

대신에 a ValueTask<TResult> 를 사용 하 여 장단 사항이 있습니다 Task<TResult>. 예를 들어 ValueTask<TResult> 성공적인 결과를 동기적으로 사용할 수 있는 경우 할당을 방지할 수 있지만 참조 형식은 단일 필드인 반면 Task<TResult> 에 여러 필드도 포함됩니다. 즉, 메서드에서 반환 ValueTask<TResult> 하면 더 많은 데이터가 복사됩니다. 또한 비동기 메서드 내에서 메서드를 반환 ValueTask<TResult> 하는 메서드가 대기하는 경우 단일 참조 대신 여러 필드가 포함된 구조체를 저장해야 하므로 해당 비동기 메서드의 상태 컴퓨터가 더 커집니다.

await ValueTask<TResult> 를 사용하여 비동기 작업의 결과를 사용하는 것 이외의 용도의 경우 더 많은 할당이 필요한 더 복잡해진 프로그래밍 모델로 이어질 수 있습니다. 예를 들어 캐시된 작업이 있는 작업을 일반적인 결과로 반환 Task<TResult> 하거나 ValueTask<TResult>. 결과의 소비자가 메서드와 같은 ValueTask<TResult>WhenAnyWhenAll 방법으로 사용하려는 경우 먼저 usingAsTaskTask<TResult> 변환 Task<TResult> 해야 하므로 캐시된 Task<TResult> 항목이 처음에 사용되었으면 방지할 수 있는 할당이 발생합니다.

따라서 비동기 메서드의 기본 선택은 a Task 또는 Task<TResult>. 성능 분석이 가치가 ValueTask<TResult>Task<TResult>있음을 증명하는 경우에만 . 제네릭이 아닌 버전은 ValueTask 대부분의 시나리오에서는 권장되지 않습니다. 이 속성은 CompletedTask 완료를 반환하는 메서드가 동기적으로 성공적으로 완료된 경우 성공적으로 완료된 싱글톤을 Task 다시 전달하는 데 사용해야 합니다.

메모

ValueTask<TResult> 형식의 사용은 C# 7.0부터 지원되며 Visual Basic 버전에서는 지원되지 않습니다.

메모

매개 변수가 없는 생성자 또는 default(ValueTask<TResult>) 구문(초기화되지 않은 구조체)을 사용하여 만든 인스턴스는 동기적으로 성공적으로 완료된 작업을 결과로 default(TResult)나타냅니다.

생성자

Name Description
ValueTask<TResult>(IValueTaskSource<TResult>, Int16)

작업을 나타내는 개체를 ValueTask<TResult> 사용하여 IValueTaskSource<TResult> 클래스의 새 인스턴스를 초기화합니다.

ValueTask<TResult>(Task<TResult>)

작업을 나타내는 제공된 작업을 사용하여 클래스의 ValueTask<TResult> 새 인스턴스를 초기화합니다.

ValueTask<TResult>(TResult)

성공적인 작업의 제공된 결과를 사용하여 클래스의 ValueTask<TResult> 새 인스턴스를 초기화합니다.

속성

Name Description
IsCanceled

이 개체가 취소된 작업을 나타내는지 여부를 나타내는 값을 가져옵니다.

IsCompleted

이 개체가 완료된 작업을 나타내는지 여부를 나타내는 값을 가져옵니다.

IsCompletedSuccessfully

이 개체가 성공적으로 완료된 작업을 나타내는지 여부를 나타내는 값을 가져옵니다.

IsFaulted

이 개체가 실패한 작업을 나타내는지 여부를 나타내는 값을 가져옵니다.

Result

결과를 가져옵니다.

메서드

Name Description
AsTask()

ValueTask<TResult>개체를 Task<TResult> 나타내는 개체를 검색합니다.

ConfigureAwait(Boolean)

이 값에 대한 awaiter를 구성합니다.

Equals(Object)

지정한 개체와 현재 개체가 같은지 여부를 확인합니다.

Equals(ValueTask<TResult>)

지정된 ValueTask<TResult> 개체가 현재 ValueTask<TResult> 개체와 같은지 여부를 확인합니다.

GetAwaiter()

이 값에 대한 awaiter를 만듭니다.

GetHashCode()

이 인스턴스의 해시 코드를 반환합니다.

Preserve()

ValueTask<TResult> 향후 언제든지 사용할 수 있는 값을 가져옵니다.

ToString()

현재 개체를 나타내는 문자열을 반환합니다.

연산자

Name Description
Equality(ValueTask<TResult>, ValueTask<TResult>)

같음의 두 값을 비교합니다.

Inequality(ValueTask<TResult>, ValueTask<TResult>)

ValueTask<TResult> 값이 같지 않은지 여부를 확인합니다.

적용 대상