ValueTask<TResult> 구조체

정의

Task<TResult>TResult를 래핑하는 값 형식을 제공합니다. 이 중 하나만 사용됩니다.Provides a value type that wraps a Task<TResult> and a TResult, only one of which is used.

generic <typename TResult>
public value class ValueTask : 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

결과입니다.The result.

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

설명

인스턴스 ValueTask<TResult> 는를 Task<TResult> 사용 하 여 AsTask대기 하거나로 변환할 수 있습니다.A ValueTask<TResult> instance may either be awaited or converted to a Task<TResult> using AsTask. 인스턴스 ValueTask<TResult> 는 한 번만 대기 수 있으며, 소비자는 인스턴스가 완료 GetAwaiter() 될 때까지를 호출 하지 않을 수 있습니다.A ValueTask<TResult> instance may only be awaited once, and consumers may not call GetAwaiter() until the instance has completed. 이러한 제한 사항이 허용 되지 않는 경우를 ValueTask<TResult> 호출 Task<TResult> AsTask하 여를로 변환 합니다.If these limitations are unacceptable, convert the ValueTask<TResult> to a Task<TResult> by calling AsTask.

ValueTask<TResult> 인스턴스에서 다음 작업을 수행 하면 안 됩니다.The following operations should never be performed on a ValueTask<TResult> instance:

  • 인스턴스를 여러 번 대기 합니다.Awaiting the instance multiple times.
  • AsTask 여러 번 호출 합니다.Calling AsTask multiple times.
  • 작업이 .Result 아직 .GetAwaiter().GetResult() 완료 되지 않았거나 여러 번 사용 하는 경우 또는를 사용 합니다.Using .Result or .GetAwaiter().GetResult() when the operation hasn't yet completed, or using them multiple times.
  • 이러한 방법 중 하나를 사용 하 여 인스턴스를 사용 합니다.Using more than one of these techniques to consume the instance.

위의 작업을 수행 하는 경우 결과가 정의 되지 않습니다.If you do any of the above, the results are undefined.

메서드는 해당 작업의 결과 동기적으로 사용할 수는 고가 되도록 예상 되는 경우 될 때이 값 형식 인스턴스의 호출 자주 하는 새 할당의 비용을 반환할 수 있습니다 Task<TResult> 호출할 때마다 감당 하기 어려운 됩니다.A method may return an instance of this value type when it's likely that the result of its operation will be available synchronously, and when it's expected to be invoked so frequently that the cost of allocating a new Task<TResult> for each call will be prohibitive.

사용 하 여에 장단점이 있습니다를 ValueTask<TResult> of를 Task<TResult>입니다.There are tradeoffs to using a ValueTask<TResult> instead of a Task<TResult>. 예를 들어,는 ValueTask<TResult> 성공적인 결과를 동기적으로 사용할 수 있는 경우 할당을 방지 하는 데 도움이 될 수 있지만는 여러 필드를 포함 Task<TResult> 하는 반면,는 단일 필드입니다.For example, while a ValueTask<TResult> can help avoid an allocation in the case where the successful result is available synchronously, it also contains multiple fields, whereas a Task<TResult> as a reference type is a single field. 즉, 메서드에서을 반환 ValueTask<TResult> 하면 더 많은 데이터가 복사 됩니다.This means that returning a ValueTask<TResult> from a method results in copying more data. 또한를 ValueTask<TResult> 반환 하는 메서드가 비동기 메서드 내에서 대기 경우 해당 비동기 메서드에 대 한 상태 시스템은 단일 참조 대신 여러 필드를 포함 하는 구조체를 저장 해야 하기 때문에 더 큽니다.It also means, that if a method that returns a ValueTask<TResult> is awaited within an async method, the state machine for that async method will be larger, because it must store a struct containing multiple fields instead of a single reference.

사용 하는 비동기 작업의 결과 사용 하는 이외의 사용 하 여 await에 대 한 ValueTask<TResult> 자세한 할당 해야 하는 더 복잡 한 프로그래밍 모델에 발생할 수 있습니다.For uses other than consuming the result of an asynchronous operation using await, ValueTask<TResult> can lead to a more convoluted programming model that requires more allocations. 예를 들어 중 하나를 반환할 수 있는 메서드를 Task<TResult> 일반적인 결과적으로 캐시 된 작업을 사용 하 여 또는 ValueTask<TResult>합니다.For example, consider a method that could return either a Task<TResult> with a cached task as a common result or a ValueTask<TResult>. 결과의 소비자로 사용 하려는 경우는 Task<TResult> 같은 메서드에서 WhenAll 또는 WhenAnyValueTask<TResult> 으로 먼저 변환 되어야 합니다는 Task<TResult> 를 사용 하 여 AsTask를 된 것을 방지 하는 경우는 할당을 캐시 된 Task<TResult> 처음에 사용한 것입니다.If the consumer of the result wants to use it as a Task<TResult> in a method like WhenAll or WhenAny, the ValueTask<TResult> must first be converted to a Task<TResult> using AsTask, leading to an allocation that would have been avoided if a cached Task<TResult> had been used in the first place.

이와 같이 모든 비동기 메서드에 대 한 기본 선택 해야 반환 된 Task 또는 Task<TResult>합니다.As such, the default choice for any asynchronous method should be to return a Task or Task<TResult>. 성능 분석을 입증 유용한 경우에을 ValueTask<TResult> 대신 사용할 수는 Task<TResult>합니다.Only if performance analysis proves it worthwhile should a ValueTask<TResult> be used instead of a Task<TResult>. 대부분의 시나리오에서는 제네릭이 ValueTask 아닌 버전의가 권장 되지 않습니다.The non generic version of ValueTask is not recommended for most scenarios. CompletedTaskTask 반환 하는 메서드가 동기적으로 완료 되는 경우 속성을 사용 하 여 성공적으로 완료 된 단일 항목을 다시 전달 해야 합니다.The CompletedTask property should be used to hand back a successfully completed singleton in the case where a method returning a Task completes synchronously and successfully.

참고

ValueTask<TResult> 형식을 사용 하는 것은 C# 7.0부터 지원 되며 Visual Basic의 모든 버전에서 지원 되지 않습니다.The use of the ValueTask<TResult> type is supported starting with C# 7.0, and is not supported by any version of Visual Basic.

생성자

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

작업을 나타내는 IValueTaskSource<TResult>개체를 사용하여 ValueTask<TResult> 클래스의 새 인스턴스를 초기화합니다.Initializes a new instance of the ValueTask<TResult> class with a IValueTaskSource<TResult> object that represents the operation.

ValueTask<TResult>(Task<TResult>)

작업을 나타내는 제공된 작업을 사용하여 ValueTask<TResult> 클래스의 새 인스턴스를 초기화합니다.Initializes a new instance of the ValueTask<TResult> class using the supplied task that represents the operation.

ValueTask<TResult>(TResult)

성공한 작업의 제공된 결과를 사용하여 ValueTask<TResult> 클래스의 새 인스턴스를 초기화합니다.Initializes a new instance of the ValueTask<TResult> class using the supplied result of a successful operation.

속성

IsCanceled

이 개체가 취소된 작업을 나타내는지를 지정하는 값을 가져옵니다.Gets a value that indicates whether this object represents a canceled operation.

IsCompleted

이 개체가 완료된 작업을 나타내는지를 지정하는 값을 가져옵니다.Gets a value that indicates whether this object represents a completed operation.

IsCompletedSuccessfully

이 개체가 성공적으로 완료된 작업을 나타내는지를 지정하는 값을 가져옵니다.Gets a value that indicates whether this object represents a successfully completed operation.

IsFaulted

이 개체가 실패한 작업을 나타내는지를 지정하는 값을 가져옵니다.Gets a value that indicates whether this object represents a failed operation.

Result

결과를 가져옵니다.Gets the result.

메서드

AsTask()

ValueTask<TResult>를 나타내는 Task<TResult> 개체를 검색합니다.Retrieves a Task<TResult> object that represents this ValueTask<TResult>.

ConfigureAwait(Boolean)

이 값에 awaiter를 구성합니다.Configures an awaiter for this value.

CreateAsyncMethodBuilder()

비동기 메서드와 함께 사용할 메서드 작성기를 만듭니다.Creates a method builder for use with an async method.

Equals(Object)

지정한 개체와 현재 개체가 같은지 여부를 확인합니다.Determines whether the specified object is equal to the current object.

Equals(ValueTask<TResult>)

지정된 ValueTask<TResult> 개체가 현재 ValueTask<TResult> 개체와 같은지 여부를 확인합니다.Determines whether the specified ValueTask<TResult> object is equal to the current ValueTask<TResult> object.

GetAwaiter()

이 값에 awaiter를 만듭니다.Creates an awaiter for this value.

GetHashCode()

이 인스턴스의 해시 코드를 반환합니다.Returns the hash code for this instance.

Preserve()

향후 어떤 시점에서든 사용할 수 있는 ValueTask<TResult>를 가져옵니다.Gets a ValueTask<TResult> that may be used at any point in the future.

ToString()

현재 개체를 나타내는 문자열을 반환합니다.Returns a string that represents the current object.

연산자

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

두 값이 같은지 여부를 비교합니다.Compares two values for equality.

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

ValueTask<TResult> 값이 서로 같지 않은지 확인합니다.Determines whether two ValueTask<TResult> values are unequal.

적용 대상