ValueTask<TResult> Struktur
Definisi
Penting
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Menyediakan jenis nilai yang membungkus Task<TResult> dan TResult, hanya satu yang digunakan.
generic <typename TResult>
public value class ValueTask : IEquatable<System::Threading::Tasks::ValueTask<TResult>>
public readonly struct ValueTask<TResult> : IEquatable<System.Threading.Tasks.ValueTask<TResult>>
type ValueTask<'Result> = struct
Public Structure ValueTask(Of TResult)
Implements IEquatable(Of ValueTask(Of TResult))
Jenis parameter
- TResult
Hasilnya.
- Warisan
- Penerapan
-
IEquatable<ValueTask<TResult>>
Keterangan
Instans ValueTask<TResult> dapat ditunggu atau dikonversi ke Task<TResult> menggunakan AsTask. Instans ValueTask<TResult> hanya dapat ditunggu sekali, dan konsumen mungkin tidak membaca Result sampai instans selesai. Jika batasan ini tidak dapat diterima, konversikan ValueTask<TResult> ke dengan Task<TResult> memanggil AsTask.
Operasi berikut tidak boleh dilakukan pada ValueTask<TResult> instans:
- Menunggu instans beberapa kali.
- Memanggil AsTask beberapa kali.
- Menggunakan
.Resultatau.GetAwaiter().GetResult()ketika operasi belum selesai, atau menggunakannya beberapa kali. - Menggunakan lebih dari salah satu teknik ini untuk mengonsumsi instans.
Jika Anda melakukan salah satu hal di atas, hasilnya tidak ditentukan.
Metode dapat mengembalikan instans jenis nilai ini ketika kemungkinan hasil operasinya akan tersedia secara sinkron, dan ketika diharapkan untuk sering dipanggil sehingga biaya alokasi baru Task<TResult> untuk setiap panggilan akan dilarang.
Ada tradeoff untuk menggunakan ValueTask<TResult> alih-alih Task<TResult>. Misalnya, sementara dapat ValueTask<TResult> membantu menghindari alokasi dalam kasus di mana hasil yang berhasil tersedia secara sinkron, itu juga berisi beberapa bidang, sedangkan Task<TResult> sebagai jenis referensi adalah bidang tunggal. Ini berarti bahwa mengembalikan ValueTask<TResult> dari metode menghasilkan penyalinan lebih banyak data. Ini juga berarti, bahwa jika metode yang mengembalikan ValueTask<TResult> ditunggu dalam metode asinkron, komputer status untuk metode asinkron tersebut akan lebih besar, karena harus menyimpan struktur yang berisi beberapa bidang alih-alih satu referensi.
Untuk penggunaan selain mengonsumsi hasil operasi asinkron menggunakan tunggu, ValueTask<TResult> dapat menyebabkan model pemrograman yang lebih berbelit-belok yang membutuhkan lebih banyak alokasi. Misalnya, pertimbangkan metode yang dapat mengembalikan Task<TResult> dengan tugas yang di-cache sebagai hasil umum atau ValueTask<TResult>. Jika konsumen hasil ingin menggunakannya sebagai Task<TResult> dalam metode seperti WhenAll atau WhenAny, ValueTask<TResult> pertama-tama harus dikonversi ke Task<TResult> penggunaan AsTask, yang mengarah ke alokasi yang akan dihindari jika cache Task<TResult> telah digunakan di tempat pertama.
Dengan demikian, pilihan default untuk metode asinkron apa pun harus mengembalikan Task atau Task<TResult>. Hanya jika analisis performa membuktikan ada baiknya jika ValueTask<TResult> digunakan alih-alih Task<TResult>. Versi ValueTask non generik tidak disarankan untuk sebagian besar skenario. Properti CompletedTask harus digunakan untuk mengembalikan singleton yang berhasil diselesaikan dalam kasus di mana metode yang Task mengembalikan selesai secara sinkron dan berhasil.
Note
Penggunaan jenis ValueTask<TResult> didukung dimulai dengan C# 7.0, dan tidak didukung oleh versi Visual Basic apa pun.
Note
Instans yang dibuat dengan konstruktor tanpa parameter atau dengan default(ValueTask<TResult>) sintaks (struktur yang diinisialisasi nol) mewakili operasi yang berhasil diselesaikan secara sinkron dengan hasil default(TResult).
Konstruktor
| Nama | Deskripsi |
|---|---|
| ValueTask<TResult>(IValueTaskSource<TResult>, Int16) |
Menginisialisasi instans ValueTask<TResult> baru kelas dengan IValueTaskSource<TResult> objek yang mewakili operasi. |
| ValueTask<TResult>(Task<TResult>) |
Menginisialisasi instans ValueTask<TResult> baru kelas menggunakan tugas yang disediakan yang mewakili operasi. |
| ValueTask<TResult>(TResult) |
Menginisialisasi instans ValueTask<TResult> baru kelas menggunakan hasil yang disediakan dari operasi yang berhasil. |
Properti
| Nama | Deskripsi |
|---|---|
| IsCanceled |
Mendapatkan nilai yang menunjukkan apakah objek ini mewakili operasi yang dibatalkan. |
| IsCompleted |
Mendapatkan nilai yang menunjukkan apakah objek ini mewakili operasi yang selesai. |
| IsCompletedSuccessfully |
Mendapatkan nilai yang menunjukkan apakah objek ini mewakili operasi yang berhasil diselesaikan. |
| IsFaulted |
Mendapatkan nilai yang menunjukkan apakah objek ini mewakili operasi yang gagal. |
| Result |
Mendapatkan hasilnya. |
Metode
| Nama | Deskripsi |
|---|---|
| AsTask() |
Task<TResult> Mengambil objek yang mewakili ini ValueTask<TResult>. |
| ConfigureAwait(Boolean) |
Mengonfigurasi awaiter untuk nilai ini. |
| Equals(Object) |
Menentukan apakah objek yang ditentukan sama dengan objek saat ini. |
| Equals(ValueTask<TResult>) |
Menentukan apakah objek yang ditentukan ValueTask<TResult> sama dengan objek saat ini ValueTask<TResult> . |
| GetAwaiter() |
Membuat awaiter untuk nilai ini. |
| GetHashCode() |
Mengembalikan kode hash untuk instans ini. |
| Preserve() |
ValueTask<TResult> Mendapatkan yang dapat digunakan kapan saja di masa mendatang. |
| ToString() |
Mengembalikan string yang mewakili objek saat ini. |
Operator
| Nama | Deskripsi |
|---|---|
| Equality(ValueTask<TResult>, ValueTask<TResult>) |
Membandingkan dua nilai untuk kesetaraan. |
| Inequality(ValueTask<TResult>, ValueTask<TResult>) |
Menentukan apakah dua ValueTask<TResult> nilai tidak sama. |