Bagikan melalui


CA2012: Gunakan ValueTasks dengan benar

Properti Nilai
ID Aturan CA2012
Judul Gunakan ValueTasks dengan benar
Golongan Keandalan
Perbaikan bersifat disruptif atau non-disruptif Non-disruptif
Diaktifkan secara default di .NET 10 Sebagai saran

Penyebab

ValueTask Instans yang dikembalikan dari pemanggilan anggota digunakan dengan cara yang dapat menyebabkan pengecualian, kerusakan, atau performa yang buruk.

Deskripsi aturan

ValueTask instans yang dikembalikan dari pemanggilan anggota dimaksudkan untuk langsung ditunggu. Upaya untuk menggunakan ValueTask beberapa kali atau untuk langsung mengakses hasil seseorang sebelum diketahui selesai dapat mengakibatkan pengecualian atau kerusakan. Mengabaikan ValueTask kemungkinan merupakan indikasi bug fungsional dan dapat menurunkan performa.

Cara memperbaiki pelanggaran

Secara umum, ValueTasks harus langsung ditunggu daripada dibuang atau disimpan ke lokasi lain seperti variabel atau bidang lokal.

Kapan harus menekan peringatan

Untuk ValueTask objek yang dikembalikan dari panggilan anggota arbitrer, pemanggil perlu mengasumsikan bahwa ValueTask harus dikonsumsi (misalnya, ditunggu) sekali dan hanya sekali. Namun, jika pengembang juga mengontrol anggota yang dipanggil dan memiliki pengetahuan lengkap tentang implementasinya, pengembang mungkin tahu aman untuk menekan peringatan, misalnya, jika pengembalian ValueTask selalu membungkus Task objek.

Example

public class NumberValueTask
{
    public async ValueTask<int> GetNumberAsync()
    {
        await Task.Delay(100);
        return 123;
    }

    public async Task UseValueTaskIncorrectlyAsync()
    {
        // This code violates the rule,
        // because ValueTask is awaited multiple times
        ValueTask<int> numberValueTask = GetNumberAsync();

        int first = await numberValueTask;
        int second = await numberValueTask; // <- illegal reuse

        // ...
    }

    // This code satisfies the rule.
    public async Task UseValueTaskCorrectlyAsync()
    {
        int first = await GetNumberAsync();
        int second = await GetNumberAsync();

        // ..
    }

    public async Task UseValueTaskAsTaskAsync()
    {
        ValueTask<int> numberValueTask = GetNumberAsync();

        Task<int> numberTask = numberValueTask.AsTask();

        int first = await numberTask;
        int second = await numberTask;

        // ...
    }
}

Menyembunyikan peringatan

Jika Anda hanya ingin menyembunyikan satu pelanggaran, tambahkan arahan praprosedur ke file sumber Anda untuk dinonaktifkan lalu aktifkan kembali aturannya.

#pragma warning disable CA2012
// The code that's violating the rule is on this line.
#pragma warning restore CA2012

Untuk menonaktifkan aturan untuk file, folder, atau proyek, atur tingkat keparahannya ke none dalam file konfigurasi.

[*.{cs,vb}]
dotnet_diagnostic.CA2012.severity = none

Untuk informasi selengkapnya, lihat Cara menyembunyikan peringatan analisis kode.

Lihat juga