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>>

설명

AsTask를 사용 하 여 ValueTask<TResult> 인스턴스를 대기 하거나 Task<TResult>로 변환할 수 있습니다.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. 이러한 제한 사항이 허용 되지 않는 경우 AsTask를 호출 하 여 ValueTask<TResult> Task<TResult>으로 변환 합니다.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.

Task<TResult>대신 ValueTask<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.

Wait를 사용 하 여 비동기 작업의 결과를 사용 하는 것 외의 경우에는 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>. 결과의 소비자가 WhenAll 또는 ValueTask<TResult> WhenAny와 같은 메서드에서 Task<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>. 성능 분석에서이를 증명 하는 것이 유용한 경우에만 Task<TResult>대신 ValueTask<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. Task를 반환 하는 메서드가 동기적으로 완료 되 고 성공적으로 완료 되는 경우 CompletedTask 속성을 사용 하 여 성공적으로 완료 된 단일 항목을 다시 전달 해야 합니다.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)

작업을 나타내는 ValueTask<TResult>개체를 사용하여 IValueTaskSource<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()

Task<TResult>를 나타내는 ValueTask<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()

현재 개체를 나타내는 string을 반환합니다.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.

적용 대상