CA2007: Jangan langsung menunggu Tugas

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. 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 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

Lihat juga