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

형식 매개 변수


결과입니다.The result.



인스턴스는를 ValueTask<TResult> 사용 하 여 대기 하거나로 변환할 수 있습니다 Task<TResult> AsTask .A ValueTask<TResult> instance may either be awaited or converted to a Task<TResult> using AsTask. ValueTask<TResult>인스턴스는 한 번만 대기 수 있으며, 소비자 Result 는 인스턴스가 완료 될 때까지 읽을 수 없습니다.A ValueTask<TResult> instance may only be awaited once, and consumers may not read Result 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> 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.

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>. 결과의 소비자가 또는 등의 메서드에서이를 사용 하려는 경우 먼저를 사용 하 여로 변환 해야 합니다 .이 경우 캐시를 처음 사용 하는 경우 사용 하지 않는 것이 Task<TResult> WhenAll WhenAny ValueTask<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. CompletedTask을 반환 하는 메서드가 동기적으로 완료 되는 경우 속성을 사용 하 여 성공적으로 완료 된 단일 항목을 다시 전달 해야 합니다 Task .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> 클래스의 새 인스턴스를 초기화합니다.Initializes a new instance of the ValueTask<TResult> class using the supplied task that represents the operation.


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



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


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


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


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


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



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


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


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


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


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


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


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


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


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

적용 대상