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 | CA2008 |
| Judul | Jangan membuat tugas tanpa melewati TaskScheduler |
| Kategori | Keandalan |
| Perbaikan bersifat disruptif atau non-disruptif | Non-disruptif |
| Diaktifkan secara default di .NET 10 | Tidak |
Penyebab
Pembuatan tugas atau operasi kelanjutan menggunakan kombinasi metode yang tidak menentukan parameter TaskScheduler.
Deskripsi aturan
Metode pembuatan dan kelanjutan tugas .NET berikut memiliki overload yang memungkinkan Anda untuk menentukan atau menghilangkan instans TaskScheduler.
Selalu tentukan argumen eksplisit TaskScheduler untuk menghindari nilai default Current , yang perilakunya ditentukan oleh pemanggil dan dapat bervariasi pada runtime. Current mengembalikan penjadwal yang terkait dengan Task yang sedang berjalan pada utas tersebut. Jika tidak ada tugas seperti itu, fungsi ini akan mengembalikan Default, yang mewakili kumpulan utas. Penggunaan Current dapat menyebabkan kebuntuan atau masalah respons UI dalam beberapa situasi, ketika dimaksudkan untuk menjalankan tugas pada kumpulan utas, tetapi sebaliknya menunggu untuk kembali ke utas UI.
Untuk informasi lebih lanjut dan contoh terperinci, lihat TaskCreationOptions baru dan TaskContinuationOptions di .NET Framework 4.5.
Catatan
VSTHRD105 - Hindari kelebihan metode yang mengasumsikan TaskScheduler.Current adalah aturan serupa yang diterapkan dalam paket Microsoft.VisualStudio.Threading.Analyzers .
Cara memperbaiki pelanggaran
Untuk memperbaiki pelanggaran, panggil metode overload yang mengambil TaskScheduler dan secara eksplisit meneruskan Default atau Current untuk memperjelas maksud.
Example
// This code violates the rule.
var badTask = Task.Factory.StartNew(
() =>
{
// ...
}
);
badTask.ContinueWith(
t =>
{
// ...
}
);
// This code satisfies the rule.
var goodTask = Task.Factory.StartNew(
() =>
{
// ...
},
CancellationToken.None,
TaskCreationOptions.None,
TaskScheduler.Default
);
goodTask.ContinueWith(
t =>
{
// ...
},
CancellationToken.None,
TaskContinuationOptions.None,
TaskScheduler.Default
);
Kapan harus menekan peringatan
Peringatan ini ditujukan terutama untuk perpustakaan perangkat lunak, tempat kode dapat dijalankan dalam lingkungan yang acak dan tidak boleh membuat asumsi tentang lingkungan atau cara pemanggil metode mungkin akan memanggil atau menunggunya. Mungkin tepat untuk menekan peringatan untuk proyek yang mewakili kode aplikasi daripada kode pustaka.
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 CA2008
// The code that's violating the rule is on this line.
#pragma warning restore CA2008
Untuk menonaktifkan aturan untuk file, folder, atau proyek, atur tingkat keparahannya ke none dalam file konfigurasi.
[*.{cs,vb}]
dotnet_diagnostic.CA2008.severity = none
Untuk informasi selengkapnya, lihat Cara menyembunyikan peringatan analisis kode.