CA2016: CancellationToken parametresini bir tane alan yöntemlere iletin

Özellik Değer
Tür adı ForwardCancellationTokenToInvocations
Kural Kimliği CA2016
Başlık CancellationToken parametresini, parametre alan metotlara iletin
Kategori Güvenilirlik
Hataya neden olan veya bozulmayan düzeltme Hataya neden olmayan
.NET 9'da varsayılan olarak etkin Öneri olarak

Neden

Bu kural, parametre kabul edebilen ancak herhangi bir CancellationToken parametre geçirmeyen yöntem çağrılarını bulur ve üst yöntemin CancellationToken çağrılarını onlara iletmeyi önerir.

Kural açıklaması

Bu kural, son parametresi olarak bir CancellationToken alan yöntem tanımlarını analiz eder ve ardından gövdesinde çağrılan tüm yöntemleri analiz eder. Yöntem çağrılarından herhangi biri son parametre olarak bir CancellationToken kabul edebilirse veya son parametre olarak a CancellationToken alan bir aşırı yüklemeye sahipse, kural iptal bildiriminin bunu dinleyebilen tüm işlemlere yayılmasını sağlamak için bu seçeneğin kullanılmasını önerir.

Not

Kural CA2016, türün kullanılabildiği CancellationToken tüm .NET sürümlerinde kullanılabilir. Geçerli sürümler için CancellationToken "Şunlar için geçerlidir" bölümüne bakın.

İhlalleri düzeltme

İhlalleri el ile düzeltebilir veya Visual Studio'da bulunan kod düzeltmesini kullanabilirsiniz. Yöntem çağrısının yanında görünen ampulün üzerine gelin ve önerilen değişikliği seçin.

Aşağıdaki örnekte önerilen iki değişiklik gösterilmektedir:

Kural CA2016 - CancellationToken parametresini bir tane alan yöntemlere iletme

İptal edilen işlem bildirimini daha düşük yöntem çağrılarına iletmekle ilgilenmiyorsanız, bu kuralın ihlalini gizlemeniz güvenlidir. Ayrıca, C# (NothingVisual Basic'te) veya None kural ihlalini engellemek için açıkça geçirebilirsinizdefault.

Kural çeşitli ihlalleri algılayabilir. Aşağıdaki örneklerde kuralın algılayabileceğiniz durumlar gösterilmektedir:

Örnek 1

yöntemi isteğe bağlı bir belirteç parametresi MyMethod tanımladığından, kural parametresini MyMethodWithDefault çağrısına iletmeyi c önerir:

using System.Threading;

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

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

Düzeltmek:

Parametresini iletin c :

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

İptal bildirimlerini daha düşük çağrılara iletmekle ilgilenmiyorsanız şunlardan birini yapabilirsiniz:

Açıkça geçirin default:

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

Veya açıkça geçirin CancellationToken.None:

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

Örnek 2

Yöntemin parametreyi MyMethod alan CancellationToken bir aşırı yükü olduğundan kural parametresinin MyMethodWithOverload çağrıya iletilmesi c önerisinde bulunuyor:

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();
        }
    }
}

Düzeltmek:

Parametresini iletin c :

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

İptal bildirimlerini daha düşük çağrılara iletmekle ilgilenmiyorsanız şunlardan birini yapabilirsiniz:

Açıkça geçirin default:

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

Veya açıkça geçirin CancellationToken.None:

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

İhlal dışı örnekler

CancellationToken Üst yöntemdeki parametre son konumda değil:

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();
        }
    }
}

CancellationToken Varsayılan yöntemdeki parametre son konumda değil:

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();
        }
    }
}

CancellationToken Aşırı yükleme yöntemindeki parametresi son konumda değil:

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();
        }
    }
}

Üst yöntem birden CancellationToken fazla parametre tanımlar:

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();
        }
    }
}

Varsayılan değerleri olan yöntem birden CancellationToken fazla parametre tanımlar:

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();
        }
    }
}

Yöntem aşırı yüklemesi birden CancellationToken fazla parametre tanımlar:

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();
        }
    }
}

Uyarıyı gizleme

Yalnızca tek bir ihlali engellemek istiyorsanız, kuralı devre dışı bırakmak ve sonra yeniden etkinleştirmek için kaynak dosyanıza ön işlemci yönergeleri ekleyin.

#pragma warning disable CA2016
// The code that's violating the rule is on this line.
#pragma warning restore CA2016

Bir dosya, klasör veya projenin kuralını devre dışı bırakmak için, yapılandırma dosyasındaki önem derecesini none olarak ayarlayın.

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

Daha fazla bilgi için bkz . Kod analizi uyarılarını gizleme.