ValueTask<TResult> Yapı

Tanım

yalnızca biri kullanılan ve öğesini sarmalayan Task<TResult> bir TResultdeğer türü sağlar.

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

Tür Parametreleri

TResult

Sonuç.

Devralma
ValueTask<TResult>
Uygulamalar
IEquatable<ValueTask<TResult>>

Açıklamalar

Bir ValueTask<TResult> örnek beklenebilir veya kullanılarak AsTasköğesine Task<TResult> dönüştürülebilir. Bir ValueTask<TResult> örnek yalnızca bir kez beklenebilir ve tüketiciler örnek tamamlanana kadar okumayabilir Result . Bu sınırlamalar kabul edilemezse çağrısı AsTaskyaparak öğesini ValueTask<TResult> değerine Task<TResult> dönüştürün.

Aşağıdaki işlemler hiçbir zaman bir ValueTask<TResult> örnekte gerçekleştirilmemelidir:

  • Örneği birden çok kez bekliyor.
  • Birden çok kez arama AsTask .
  • İşlem .Result henüz tamamlanmadığında veya .GetAwaiter().GetResult() kullanma ya da bunları birden çok kez kullanma.
  • Örneği kullanmak için bu tekniklerden birden fazlasını kullanma.

Yukarıdakilerden birini yaparsanız sonuçlar tanımlanmamış olur.

Bir yöntem, işleminin sonucunun zaman uyumlu olarak kullanılabilir olma olasılığı yüksek olduğunda ve her çağrı için yeni Task<TResult> ayırma maliyetinin çok sık çağrılması beklendiğinde bu değer türünün bir örneğini döndürebilir.

yerine bir ValueTask<TResult>Task<TResult>kullanmanın dezavantajları vardır. Örneğin, başarılı sonucun zaman uyumlu olarak kullanılabilir olması durumunda ayırmayı ValueTask<TResult> önlemeye yardımcı olabilir, ancak başvuru türü olarak tek bir alan olan Task<TResult> birden çok alan da içerir. Bu, bir ValueTask<TResult> yöntemden döndürülerek daha fazla veri kopyalanması anlamına gelir. Ayrıca, bir döndüren ValueTask<TResult> bir yöntem zaman uyumsuz bir yöntem içinde bekleniyorsa, tek bir başvuru yerine birden çok alan içeren bir yapı depolaması gerektiğinden, bu zaman uyumsuz yöntemin durum makinesinin daha büyük olacağı anlamına gelir.

Await kullanarak zaman uyumsuz bir işlemin sonucunu kullanmak dışında kullanımlar için, ValueTask<TResult> daha fazla ayırma gerektiren daha karmaşık bir programlama modeline yol açabilir. Örneğin, ortak bir sonuç olarak önbelleğe alınmış göreve sahip bir veya döndürebilen Task<TResult> bir ValueTask<TResult>yöntem düşünün. Sonucun tüketicisi bunu veya WhenAnygibi WhenAll bir yöntemde kullanmak istiyorsa, ValueTask<TResult> ilk olarak Task<TResult> kullanarak AsTaskdeğerine dönüştürülmesi Task<TResult> gerekir ve bu da önbelleğe alınmış Task<TResult> bir yöntem kullanılmışsa önlenecek bir ayırmaya yol açar.

Bu nedenle, herhangi bir zaman uyumsuz yöntem için varsayılan seçenek veya TaskTask<TResult>döndürmek olmalıdır. Yalnızca performans analizi işe yararsa yerine bir ValueTask<TResult> kullanılması Task<TResult>gerekir. Genel olmayan sürümü ValueTask çoğu senaryo için önerilmez. özelliği, CompletedTask bir yöntemi döndüren bir yöntemin zaman uyumlu ve başarılı bir şekilde tamamlanması durumunda başarıyla tamamlanmış bir Task singletonu geri vermek için kullanılmalıdır.

Not

Türün ValueTask<TResult> kullanımı C# 7.0 ile başlayarak desteklenir ve Visual Basic'in herhangi bir sürümü tarafından desteklenmez.

Not

Parametresiz oluşturucuyla veya söz dizimi (sıfır başlatılan bir yapı) ile default(ValueTask<TResult>) oluşturulan bir örnek, sonucuyla default(TResult)zaman uyumlu, başarıyla tamamlanmış bir işlemi temsil eder.

Oluşturucular

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

işlemi temsil eden bir nesne ile sınıfının yeni bir IValueTaskSource<TResult> örneğini ValueTask<TResult> başlatır.

ValueTask<TResult>(Task<TResult>)

İşlemi temsil eden sağlanan görevi kullanarak sınıfının yeni bir örneğini ValueTask<TResult> başlatır.

ValueTask<TResult>(TResult)

Başarılı bir işlemin sağlanan sonucunu kullanarak sınıfının yeni bir örneğini ValueTask<TResult> başlatır.

Özellikler

IsCanceled

Bu nesnenin iptal edilen işlemi temsil edip etmediğini gösteren bir değer alır.

IsCompleted

Bu nesnenin tamamlanmış bir işlemi temsil edip etmediğini gösteren bir değer alır.

IsCompletedSuccessfully

Bu nesnenin başarıyla tamamlanmış bir işlemi temsil edip etmediğini gösteren bir değer alır.

IsFaulted

Bu nesnenin başarısız bir işlemi temsil edip etmediğini gösteren bir değer alır.

Result

Sonucu alır.

Yöntemler

AsTask()

Bunu ValueTask<TResult>temsil eden bir Task<TResult> nesnesi alır.

ConfigureAwait(Boolean)

Bu değer için bir awaiter yapılandırılır.

CreateAsyncMethodBuilder()

Zaman uyumsuz bir yöntemle kullanmak için bir yöntem oluşturucusu oluşturur.

Equals(Object)

Belirtilen nesnenin geçerli nesneye eşit olup olmadığını belirler.

Equals(ValueTask<TResult>)

Belirtilen ValueTask<TResult> nesnenin geçerli ValueTask<TResult> nesneye eşit olup olmadığını belirler.

GetAwaiter()

Bu değer için bir awaiter oluşturur.

GetHashCode()

Bu örneğe ilişkin karma kodu döndürür.

Preserve()

Gelecekte herhangi bir noktada kullanılabilecek bir ValueTask<TResult> alır.

ToString()

Geçerli nesneyi temsil eden dizeyi döndürür.

İşleçler

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

Eşitlik için iki değeri karşılaştırır.

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

İki ValueTask<TResult> değerin eşit olmadığını belirler.

Şunlara uygulanır