Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
| Properti | Nilai |
|---|---|
| ID Aturan | CA2007 |
| Judul | Jangan langsung menunggu Tugas |
| Kategori | Keandalan |
| Perbaikan bersifat merusak atau tidak merusak | Tidak terputus |
| Diaktifkan secara default di .NET 10 | Tidak |
| Bahasa yang berlaku | C# dan Visual Basic |
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 untuk parameter continueOnCapturedContext.
Memanggil
ConfigureAwait(true)pada tugas memiliki perilaku yang sama dengan ketika tidak memanggil ConfigureAwait secara eksplisit. Dengan secara eksplisit memanggil metode ini, Anda memberi tahu pembaca bahwa Anda sengaja ingin melakukan kelanjutan pada konteks sinkronisasi asli.Panggil
ConfigureAwait(false)pada tugas untuk menjadwalkan kelanjutan-kelanjutan ke kumpulan utas, dengan demikian menghindari kebuntuan pada utas UI. Passingfalseadalah 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 objek 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 sembarang dan di mana kode tidak boleh membuat asumsi tentang lingkungan atau cara bagaimana pemanggil metode mungkin memanggil atau menunggu metode tersebut. 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 pengendali acara klik tombol pada aplikasi WinForms atau WPF, secara umum kelanjutan dari await harus berjalan pada utas UI, dan dengan demikian perilaku default dalam menjadwalkan kelanjutan kembali ke konteks asal itu lebih diinginkan. Sebagai contoh lain, saat menulis kode dalam aplikasi ASP.NET Core, secara default tidak ada SynchronizationContext maupun TaskScheduler, karena alasan tersebut ConfigureAwait tidak akan mengubah perilaku dengan cara 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 yang 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