Bagikan melalui


CA2016: Meneruskan parameter CancellationToken ke metode yang mengambilnya

Properti Nilai
Nama jenis ForwardCancellationTokenToInvocations
ID Aturan CA2016
Judul Meneruskan parameter CancellationToken ke metode yang mengambilnya
Golongan Keandalan
Perbaikan bersifat disruptif atau non-disruptif Non-disruptif
Diaktifkan secara default di .NET 8 Sebagai saran

Penyebab

Aturan ini menemukan pemanggilan metode yang dapat menerima parameter CancellationToken, tetapi tidak meneruskan apa pun, dan menyarankan untuk meneruskan CancellationToken metode induk ke parameter tersebut.

Deskripsi aturan

Aturan ini menganalisis definisi metode yang mengambil CancellationToken sebagai parameter terakhirnya, lalu menganalisis semua metode yang dipanggil dalam isinya. Jika salah satu pemanggilan metode dapat menerima CancellationToken sebagai parameter terakhir, atau memiliki overload yang mengambil CancellationToken sebagai parameter terakhir, maka aturan menyarankan penggunaan opsi tersebut sebagai gantinya untuk memastikan bahwa pemberitahuan pembatalan disebarluaskan ke semua operasi yang dapat mendengarkannya.

Catatan

Aturan CA2016 tersedia di semua versi .NET tempat jenis CancellationToken tersedia. Untuk versi yang berlaku, lihat bagian CancellationToken "Berlaku untuk".

Cara memperbaiki pelanggaran

Anda dapat memperbaiki pelanggaran secara manual, atau menggunakan perbaikan kode yang tersedia di Visual Studio. Arahkan kursor ke bola lampu yang muncul di samping pemanggilan metode dan pilih perubahan yang disarankan.

Contoh berikut menunjukkan dua deklarasi yang disarankan tersebut:

Rule CA2016 - Forward the CancellationToken parameter to methods that take one

Anda dapat menyembunyikan pelanggaran aturan ini jika tidak khawatir tentang meneruskan pemberitahuan operasi yang dibatalkan ke pemanggilan metode yang lebih rendah. Anda juga dapat secara eksplisit meneruskan default di C# (Nothing di Visual Basic) atau None untuk menyembunyikan pelanggaran aturan.

Aturan ini dapat mendeteksi berbagai pelanggaran. Contoh berikut menunjukkan kasus yang dapat dideteksi aturan ini:

Contoh 1

Aturan akan menyarankan penerusan parameter c dari MyMethod ke pemanggilan MyMethodWithDefault, karena metode tersebut menentukan parameter token opsional:

using System.Threading;

namespace ConsoleApp
{
    public static class MyTestClass
    {
        public static void MyMethodWithDefault(CancellationToken ct = default)
        {
        }

        public static void MyMethod(CancellationToken c)
        {
            MyMethodWithDefault();
        }
    }
}

Perbaikan:

Teruskan parameter c:

        public static void MyMethod(CancellationToken c)
        {
            MyMethodWithDefault(c);
        }

Jika Anda tidak khawatir tentang meneruskan pemberitahuan pembatalan ke pemanggilan yang lebih rendah, Anda dapat:

Meneruskan default secara eksplisit:

        public static void MyMethod(CancellationToken c)
        {
            MyMethodWithDefault(default);
        }

Atau meneruskan CancellationToken.None secara eksplisit:

        public static void MyMethod(CancellationToken c)
        {
            MyMethodWithDefault(CancellationToken.None);
        }

Contoh 2

Aturan akan menyarankan penerusan parameter c dari MyMethod ke pemanggilan MyMethodWithOverload, karena metode tersebut memiliki overload yang mengambil parameter CancellationToken:

using System.Threading;

namespace ConsoleApp
{
    public static class MyTestClass
    {
        public static void MyMethodWithOverload()
        {
        }

        public static void MyMethodWithOverload(CancellationToken ct = default)
        {
        }

        public static void MyMethod(CancellationToken c)
        {
            MyMethodWithOverload();
        }
    }
}

Perbaikan:

Teruskan parameter c:

        public static void MyMethod(CancellationToken c)
        {
            MyMethodWithOverload(c);
        }

Jika Anda tidak khawatir tentang meneruskan pemberitahuan pembatalan ke pemanggilan yang lebih rendah, Anda dapat:

Meneruskan default secara eksplisit:

        public static void MyMethod(CancellationToken c)
        {
            MyMethodWithOverload(default);
        }

Atau meneruskan CancellationToken.None secara eksplisit:

        public static void MyMethod(CancellationToken c)
        {
            MyMethodWithOverload(CancellationToken.None);
        }

Contoh non-pelanggaran

Parameter CancellationToken dalam metode induk tidak berada di posisi terakhir:

using System.Threading;

namespace ConsoleApp
{
    public static class MyTestClass
    {
        public static void MyMethodWithDefault(CancellationToken ct = default)
        {
        }

        public static void MyMethod(CancellationToken c, int lastParameter)
        {
            MyMethodWithDefault();
        }
    }
}

Parameter CancellationToken dalam metode default tidak berada di posisi terakhir:

using System.Threading;

namespace ConsoleApp
{
    public static class MyTestClass
    {
        public static void MyMethodWithDefault(CancellationToken ct = default, int lastParameter = 0)
        {
        }

        public static void MyMethod(CancellationToken c)
        {
            MyMethodWithDefault();
        }
    }
}

Parameter CancellationToken dalam metode overload tidak berada di posisi terakhir:

using System.Threading;

namespace ConsoleApp
{
    public static class MyTestClass
    {
        public static void MyMethodWithOverload(int lastParameter)
        {
        }
        public static void MyMethodWithOverload(CancellationToken ct, int lastParameter)
        {
        }

        public static void MyMethod(CancellationToken c)
        {
            MyMethodWithOverload();
        }
    }
}

Metode induk menentukan lebih dari satu parameter CancellationToken:

using System.Threading;

namespace ConsoleApp
{
    public static class MyTestClass
    {
        public static void MyMethodWithDefault(CancellationToken ct = default)
        {
        }

        public static void MyMethod(CancellationToken c1, CancellationToken c2)
        {
            MyMethodWithDefault();
        }
    }
}

Metode default menentukan lebih dari satu parameter CancellationToken:

using System.Threading;

namespace ConsoleApp
{
    public static class MyTestClass
    {
        public static void MyMethodWithDefault(CancellationToken c1 = default, CancellationToken c2 = default)
        {
        }

        public static void MyMethod(CancellationToken c)
        {
            MyMethodWithDefault();
        }
    }
}

Metode overload menentukan lebih dari satu parameter CancellationToken:

using System.Threading;

namespace ConsoleApp
{
    public static class MyTestClass
    {
        public static void MyMethodWithOverload(CancellationToken c1, CancellationToken c2)
        {
        }

        public static void MyMethodWithOverload()
        {
        }

        public static void MyMethod(CancellationToken c)
        {
            MyMethodWithOverload();
        }
    }
}

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

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

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

Untuk informasi selengkapnya, lihat Cara menyembunyikan peringatan analisis kode.