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 9 | No |
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 true
atau false
continueOnCapturedContext
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. Passingfalse
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