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

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

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

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

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

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

await ValueTask<TResult> 를 사용하여 비동기 작업의 결과를 사용하는 것 이외의 용도의 경우 더 많은 할당이 필요한 더 복잡해질 수 있습니다. 예를 들어 캐시된 작업이 있는 작업을 일반적인 결과로 반환 Task<TResult> 하거나 반환할 수 있는 메서드를 고려해 ValueTask<TResult>보세요. 결과의 소비자가 메서드와 같은 WhenAnyWhenAll ValueTask<TResult> 메서드로 사용하려는 경우 먼저 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).

생성자

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

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

ValueTask<TResult>(Task<TResult>)

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

ValueTask<TResult>(TResult)

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

속성

IsCanceled

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

IsCompleted

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

IsCompletedSuccessfully

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

IsFaulted

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

Result

결과를 가져옵니다.

메서드

AsTask()

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

ConfigureAwait(Boolean)

이 값에 awaiter를 구성합니다.

CreateAsyncMethodBuilder()

비동기 메서드와 함께 사용할 메서드 작성기를 만듭니다.

Equals(Object)

지정된 개체가 현재 개체와 같은지 확인합니다.

Equals(ValueTask<TResult>)

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

GetAwaiter()

이 값에 awaiter를 만듭니다.

GetHashCode()

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

Preserve()

향후 어떤 시점에서든 사용할 수 있는 ValueTask<TResult>를 가져옵니다.

ToString()

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

연산자

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

두 값이 같은지 여부를 비교합니다.

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

ValueTask<TResult> 값이 서로 같지 않은지 확인합니다.

적용 대상