Bagikan melalui


CA2007: Jangan langsung menunggu Tugas

Properti Nilai
ID Aturan CA2007
Judul Jangan langsung menunggu Tugas
Golongan Keandalan
Perbaikan bersifat disruptif atau non-disruptif Non-disruptif
Diaktifkan secara default di .NET 8 Tidak

Penyebab

Metode asinkron menungguTask secara langsung.

Deskripsi aturan

Ketika metode asinkron menunggu Task secara langsung, kelanjutan biasanya terjadi di utas yang sama yang membuat tugas, tergantung pada konteks asinkron. Perilaku ini dapat menjadi mahal dalam hal performa dan dapat mengakibatkan kebuntuan pada alur antarmuka pengguna. Pertimbangkan memanggil Task.ConfigureAwait(Boolean) untuk menandakan niat Anda untuk melanjutkan.

Cara memperbaiki pelanggaran

Untuk memperbaiki pelanggaran, panggil ConfigureAwait pada yang ditunggu Task. Anda dapat meneruskan continueOnCapturedContext atau falsetrue untuk parameter .

  • Memanggil ConfigureAwait(true) tugas memiliki perilaku yang sama dengan tidak secara eksplisit memanggil ConfigureAwait. Dengan secara eksplisit memanggil metode ini, Anda memberi tahu pembaca bahwa Anda sengaja ingin melakukan kelanjutan pada konteks sinkronisasi asli.

  • Panggil ConfigureAwait(false) tugas untuk menjadwalkan kelanjutan ke kumpulan utas, sehingga menghindari kebuntuan pada utas UI. Passing false adalah opsi yang baik untuk pustaka independen aplikasi.

Contoh

Cuplikan kode berikut menghasilkan peringatan:

public async Task Execute()
{
    Task task = null;
    await task;
}

Untuk memperbaiki pelanggaran, panggil ConfigureAwait pada yang ditunggu Task:

public async Task Execute()
{
    Task task = null;
    await task.ConfigureAwait(false);
}

Kapan harus menekan peringatan

Peringatan ini ditujukan untuk pustaka, di mana kode dapat dijalankan di lingkungan arbitrer dan di mana kode tidak boleh membuat asumsi tentang lingkungan atau bagaimana pemanggil metode mungkin memanggil atau menunggu di atasnya. Umumnya tepat untuk menekan peringatan sepenuhnya untuk proyek yang mewakili kode aplikasi daripada kode pustaka; bahkan, menjalankan penganalisis ini pada kode aplikasi (misalnya, klik tombol penanganan aktivitas dalam proyek WinForms atau WPF) kemungkinan akan menyebabkan tindakan yang salah diambil.

Anda dapat menekan peringatan ini dalam situasi apa pun di mana kelanjutan harus dijadwalkan kembali ke konteks asli atau di mana tidak ada konteks seperti itu. Misalnya, saat menulis kode dalam tombol klik penanganan aktivitas dalam aplikasi WinForms atau WPF, secara umum kelanjutan dari menunggu harus berjalan pada utas UI, dan dengan demikian perilaku default menjadwalkan kelanjutan kembali ke konteks asal diinginkan. Sebagai contoh lain, saat menulis kode dalam aplikasi ASP.NET Core, secara default tidak SynchronizationContext ada atau TaskScheduler, karena alasan mana a ConfigureAwait tidak akan benar-benar mengubah perilaku apa pun.

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 CA2007
// The code that's violating the rule is on this line.
#pragma warning restore CA2007

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

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

Untuk informasi selengkapnya, lihat Cara menyembunyikan peringatan analisis kode.

Mengonfigurasi kode yang akan dianalisis

Gunakan opsi berikut untuk mengonfigurasi bagian mana dari codebase Anda yang akan menjalankan aturan ini.

Anda dapat mengonfigurasi semua opsi ini hanya untuk aturan ini, untuk semua aturan yang berlaku untuknya, atau untuk semua aturan dalam kategori ini (Keandalan) yang berlaku. Untuk informasi selengkapnya, lihat Opsi konfigurasi aturan kualitas kode.

Mengecualikan metode void asinkron

Anda dapat mengonfigurasi apakah Anda ingin mengecualikan metode asinkron yang tidak mengembalikan nilai dari aturan ini. Untuk mengecualikan metode semacam ini, tambahkan pasangan kunci-nilai berikut ke file .editorconfig di proyek Anda:

# Package version 2.9.0 and later
dotnet_code_quality.CA2007.exclude_async_void_methods = true

# Package version 2.6.3 and earlier
dotnet_code_quality.CA2007.skip_async_void_methods = true

Jenis output

Anda juga dapat mengonfigurasi jenis perakitan output mana yang akan diterapkan aturan ini. Misalnya, untuk hanya menerapkan aturan ini ke kode yang menghasilkan aplikasi konsol atau pustaka yang ditautkan secara dinamis (yaitu, bukan aplikasi UI), tambahkan pasangan kunci-nilai berikut ke file .editorconfig di proyek Anda:

dotnet_code_quality.CA2007.output_kind = ConsoleApplication, DynamicallyLinkedLibrary

Baca juga