ValueTask<TResult> Yapı

Tanım

bir Task<TResult> ve TResultsarmalayan bir değer türü sağlar ve bunlardan yalnızca biri kullanılır.

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 Task<TResult>öğesine AsTask dönüştürülebilir. Örnek ValueTask<TResult> yalnızca bir kez beklenebilir ve örnek tamamlanana kadar tüketiciler okumayabilir Result . Bu sınırlamalar kabul edilemezse çağrısı ValueTask<TResult>yaparak öğesini Task<TResult> öğesine AsTask 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 herhangi birini yaparsanız sonuçlar tanımlanmamış olur.

Bir yöntem, işleminin sonucunun zaman uyumlu bir şekilde kullanılabilir olması ve her çağrı için yeni Task<TResult> ayırma maliyetinin engelleyici olması için bu kadar sık çağrılması beklendiğinde bu değer türünün bir örneğini döndürebilir.

yerine ValueTask<TResult>bir Task<TResult> kullanmanın dezavantajları vardır. Örneğin, başarılı ValueTask<TResult> sonucun zaman uyumlu bir şekilde kullanılabilir olması durumunda ayırmayı önlemeye yardımcı olabilir, ancak başvuru türü olarak tek bir alanken Task<TResult> , birden çok alan da içerir. Bu, bir yöntemden döndürülerek ValueTask<TResult> daha fazla veri kopyalanması anlamına gelir. Ayrıca, 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ış bir göreve sahip bir veya döndürebilen Task<TResult> bir ValueTask<TResult>yöntem düşünün. Sonucun tüketicisi bunu veya Task<TResult>gibi bir yöntemde kullanmak istiyorsa, ilk olarak kullanarak değerine dönüştürülmesi WhenAllWhenAnygerekir ve bu da önbelleğe alınmış ValueTask<TResult> bir dosya kullanıldığında önlenecek ayırmaya yol açar.Task<TResult>AsTaskTask<TResult>

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 bunun yararlı olduğunu kanıtlarsa, yerine bir ValueTask<TResult> kullanılmalıdır Task<TResult>. Genel olmayan sürümü ValueTask çoğu senaryo için önerilmez. özelliği, CompletedTask döndüren bir yöntemin zaman uyumlu ve başarılı bir şekilde tamamlandığı durumlarda başarıyla tamamlanmış bir Task singleton'ı geri vermek için kullanılmalıdır.

Note

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

Note

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

Oluşturucular

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

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

ValueTask<TResult>(Task<TResult>)

İşlemi temsil eden sağlanan görevi kullanarak sınıfı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

Name Description
IsCanceled

Bu nesnenin iptal edilmiş bir 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

Name Description
AsTask()

Bunu Task<TResult>temsil eden bir ValueTask<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 üzere 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ğin karma kodunu döndürür.

Preserve()

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

ToString()

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

İşleçler

Name Description
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 olup olmadığını belirler.

Şunlara uygulanır